рдЖрдЙрдЯрдСрдлрд╝рд▓рд╛рдЗрди - рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди C ++ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрди-рдореЗрдореЛрд░реА рдкреИрдЯрд░реНрди

рд╣реЗрдбрд▓реИрдВрдб рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреАрдЬ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдореИрдВ рд╕реМрднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдерд╛ рдХрд┐ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди C ++ рдХреЛрдб рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрд╛ред рдпрд╣ рд▓реЗрдЦ рдЗрди рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рд▓реЛрдХрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, OutOfLine ред


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рд╣реИ рдЬреЛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдпреЗ рд╕рд╛рдзрд╛рд░рдг рдлрд╛рдЗрд▓реЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо UNIX рд╕реЙрдХреЗрдЯ рдпрд╛ рдкрд╛рдЗрдк рд╣реИред рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЙрдирдХреЗ рд╕рд╛рде рдЧрд╣рдирддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ, рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдВрдХ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ (рд▓рдЧрднрдЧред рд▓реЗрди рдХрд╛ рдЕрд░реНрде рд╣реИ рдЕрдирд▓рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди)ред


рдкреНрд░рд╛рд░рдВрднрд┐рдХ (рд╕рд░рд▓реАрдХреГрдд) рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:


 class UnlinkingFD { std::string path; public: int fd; UnlinkingFD(const std::string& p) : path(p) { fd = open(p.c_str(), O_RDWR, 0); } ~UnlinkingFD() { close(fd); unlink(path.c_str()); } UnlinkingFD(const UnlinkingFD&) = delete; }; 

рдФрд░ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛, рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдзреНрд╡рдирд┐ рдбрд┐рдЬрд╛рдЗрди рд╣реИред рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдФрд░ рд▓рд┐рдВрдХ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП RAII рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рд░рдгреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рд╕рд░рдгреА рдореМрдЬреВрдж рд░рд╣реЗрдЧреА, рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЦреБрдж рд╣реА рд╕рдм рдХреБрдЫ рд╕рд╛рдл рдХрд░ рджреЗрдВрдЧреЗ рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдереЗред


рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдХреНрдпрд╛? рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ fd рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рддреЗ рд╕рдордп рдХреЗрд╡рд▓ path ред рдЕрдм рд╕рд░рдгреА рдореЗрдВ 40 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдХреЗрд╡рд▓ 4 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдХреИрд╢ рдореЗрдВ рдЕрдзрд┐рдХ рдорд┐рд╕ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ 90% рдбреЗрдЯрд╛ рдХреЛ "рд╕реНрдХрд┐рдк" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╕реЗ рдПрдХ рд╕рд░рдгреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рд╣реИред рдпрд╣ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди RAII рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рдХреАрдордд рдкрд░ред рдХреНрдпрд╛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬреЛ рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ?


рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдордЭреМрддрд╛ std::string рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ std::string 32 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ std::string std::unique_ptr<std::string> , рдЬрд┐рд╕рдХрд╛ рдЖрдХрд╛рд░ рдХреЗрд╡рд▓ 8 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ 40 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдШрдЯрд╛рдХрд░ 16 рдмрд╛рдЗрдЯреНрд╕ рдХрд░ рджреЗрдЧрд╛, рдЬреЛ рдПрдХ рдмрдбрд╝реА рдЙрдкрд▓рдмреНрдзрд┐ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЕрднреА рднреА рдХрдИ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЛ рджреЗрддрд╛ рд╣реИред


OutOfLine рдПрдХ рдРрд╕рд╛ рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ RAII рдХреЛ рд╡рд╕реНрддреБ рдХреЗ рдмрд╛рд╣рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП (рдардВрдбреЗ) рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЫреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдЙрдЯрдСрдлрд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ CRTP рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ рдЪрд╛рдЗрд▓реНрдб рдХреНрд▓рд╛рд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рджреВрд╕рд░рд╛ рддрд░реНрдХ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ (рдардВрдбреЗ) рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА (рдореБрдЦреНрдп) рд╡рд╕реНрддреБ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред


 struct UnlinkingFD : private OutOfLine<UnlinkingFD, std::string> { int fd; UnlinkingFD(const std::string& p) : OutOfLine<UnlinkingFD, std::string>(p) { fd = open(p.c_str(), O_RDWR, 0); } ~UnlinkingFD(); UnlinkingFD(const UnlinkingFD&) = delete; }; 

рддреЛ рдпрд╣ рд╡рд░реНрдЧ рдХреИрд╕рд╛ рд╣реИ?


 template <class FastData, class ColdData> class OutOfLine { 

рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рд╛рд╣рдЪрд░реНрдп рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдореБрдЦреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреА рдУрд░ рд╕рдВрдХреЗрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдардВрдбреА рдбреЗрдЯрд╛ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреА рдУрд░ рд╕рдВрдХреЗрдд рдХрд░рддрд╛ рд╣реИред


  inline static std::map<OutOfLine const*, std::unique_ptr<ColdData>> global_map_; 

OutOfLine рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдардВрдбреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореБрдЦреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдФрд░ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред


  template <class... TArgs> explicit OutOfLine(TArgs&&... args) { global_map_[this] = std::make_unique<ColdData>(std::forward<TArgs>(args)...); } 

рдореБрдЦреНрдп рд╡рд╕реНрддреБ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдардВрдб рд╡рд╕реНрддреБ рдХрд╛ рд╕реНрд╡рдд: рдирд┐рд╖реНрдХрд╛рд╕рди рд╣реЛрддрд╛ рд╣реИ:


  ~OutOfLine() { global_map_.erase(this); } 

рдЬрдм рдореБрдЦреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдореВрд╡рдореЗрдВрдЯ (рдореВрд╡ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ / рдореВрд╡ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░) рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрд▓реНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдирдП рдореБрдЦреНрдп рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдмрджреНрдз рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдирддреАрдЬрддрди, рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╡рд╕реНрддреБ рд╕реЗ рдардВрдбреЗ рдбреЗрдЯрд╛ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред


  explicit OutOfLine(OutOfLine&& other) { *this = other; } OutOfLine& operator=(OutOfLine&& other) { global_map_[this] = std::move(global_map_[&other]); return *this; } 

рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, OutOfLine рдХреЛ рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП OutOfLine рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдХреЙрдкреА рдСрдкрд░реЗрд╢рди рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдмрд╕ рдПрдХ рдардВрдбреА рд╡рд╕реНрддреБ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдФрд░ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


 OutOfLine(OutOfLine const&) = delete; OutOfLine& operator=(OutOfLine const&) = delete; 

рдЕрдм рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдардВрдбреЗ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред OutOfLine рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ OutOfLine рдХрдХреНрд╖рд╛ рдХреЛ cold() рдХреЗ рдирд┐рд░рдВрддрд░ рдФрд░ рдЧреИрд░-рд╕реНрдерд┐рд░ рддрд░реАрдХреЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ cold() :


  ColdData& cold() noexcept { return *global_map_[this]; } ColdData const& cold() const noexcept { return *global_map_[this]; } 

рд╡реЗ рдардВрдбреЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реИрдВред


рдпрд╣ рд▓рдЧрднрдЧ рд╕рднреА рд╣реИред рдпрд╣ UnlinkingFD рд╡рд┐рдХрд▓реНрдк рдЖрдХрд╛рд░ рдореЗрдВ 4 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрдЧрд╛, fd рдлрд╝реАрд▓реНрдб рдореЗрдВ рдХреИрд╢-рдлреНрд░реЗрдВрдбрд▓реА рдПрдХреНрд╕реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ рдФрд░ RAII рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦреЗрдЧрд╛ред рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдХрд╛рд░реНрдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реИрдВред рдЬрдм рдореБрдЦреНрдп рдмрд╛рд░-рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБ рдЪрд▓рддреА рд╣реИ, рддреЛ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдардВрдбреЗ рдбреЗрдЯрд╛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЪрд▓рддреЗ рд╣реИрдВред рдЬрдм рдореБрдЦреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрд▓реНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рднреА рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдХрднреА-рдХрднреА, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЖрдкрдХреЗ рдЬреАрд╡рди рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЬрд┐рд╢ рд░рдЪреА рдЬрд╛рддреА рд╣реИ - рдФрд░ рдЖрдкрдХреЛ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдардВрдбреЗ рдбреЗрдЯрд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред OutOfLine рдкреЗрд╢рдХрд╢ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ "рдмреИрдХ-рдЕрдк" рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рдбреА-рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдСрд░реНрдбрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред


  struct TwoPhaseInit {}; OutOfLine(TwoPhaseInit){} template <class... TArgs> void init_cold_data(TArgs&&... args) { global_map_.find(this)->second = std::make_unique<ColdData>(std::forward<TArgs>(args)...); } void release_cold_data() { global_map_[this].reset(); } 

рдпрд╣ рдПрдХ рдФрд░ OutOfLine рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рд▓ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдпрд╣ TwoPhaseInit рдЯрд╛рдЗрдк рдХрд╛ рдЯреИрдЧ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ OutOfLine рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрд▓реНрдб рдбреЗрдЯрд╛ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдзрд╛ рдирд┐рд░реНрдорд┐рдд рд░рд╣реЗрдЧрд╛ред рджреЛ-рдЪрд░рдг рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ init_cold_data рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЗрд╕рдореЗрдВ рдЯрд╛рдЗрдк ColdData рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ рдкрд╛рд╕ рдХрд░рдирд╛)ред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЖрдк рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рдкрд░ .cold() рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдардВрдбрд╛ рдбреЗрдЯрд╛ рдЕрднреА рддрдХ рдЖрд░рдВрднреАрдХреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд╛рджреГрд╢реНрдп рд╕реЗ, рдардВрдб рдбреЗрдЯрд╛ рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ~OutOfLine destructor рдХреЛ ~OutOfLine рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ release_cold_data рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗред


 }; // end of class OutOfLine 

рдЕрдм рдпрд╣ рд╕рдм рд╣реИред рддреЛ рдХреЛрдб рдХреА рдпреЗ 29 рд▓рд╛рдЗрдиреЗрдВ рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддреА рд╣реИрдВ? рд╡реЗ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рдмреАрдЪ рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╡реНрдпрд╛рдкрд╛рд░ рдЖрдзрд╛рд░ рд╣реИрдВред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд╕реНрддреБ рд╣реЛрддреА рд╣реИ, рдЬрд┐рдирдХреЗ рдХреБрдЫ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, OutOfLine рдХреИрд╢ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╕рд╛рди-рд╕реЗ-рдЙрдкрдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдзреАрдорд╛ рдХрд░рдиреЗ рдХреА рдХреАрдордд рдкрд░ред


рд╣рдо рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ - рдЕрдХреНрд╕рд░ рджреБрд░реНрд▓рдн рдпрд╛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЧрд╣рди рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рдкреВрд░рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдХрд╛рдо рдХреЗ рдЕрдВрдд рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЪрд╛рд╣реЗ рд╡рд╣ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЯреНрд░реЗрдбрд┐рдВрдЧ рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдерд╛, рдЬрд╣рд╛рдВ рд╕реЗ рдпрд╣ рдЖрджреЗрд╢ рдЖрдпрд╛ рдерд╛, рдпрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдПрдХреНрд╕реЗрд▓реЗрд░реЗрдЯрд░ рдХрд╛ рд╣реИрдВрдбрд▓ - OutOfLine рдЧрдгрдирд╛ рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧ (рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрде) рдореЗрдВ рд╣реЛрдиреЗ рдкрд░ рдХреИрд╢ рдХреЛ рд╕рд╛рдл рд░рдЦреЗрдЧрд╛ред


рдореИрдВрдиреЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рдЖрдк рдЕрдВрддрд░ рджреЗрдЦ рд╕рдХреЗрдВ рдФрд░ рдЙрд╕рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХреЗрдВред


рд▓рд┐рдкрд┐рд╕рдордп (рдПрдирдПрд╕)
рдореБрдЦреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдардВрдбрд╛ рдбреЗрдЯрд╛ (рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг)34684547
рдардВрдбрд╛ рдбреЗрдЯрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ (рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓рд╛)2938327
рдЖрдЙрдЯрдСрдлрд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛2947645

OutOfLine рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рд▓рдЧрднрдЧ OutOfLine рддреНрд╡рд░рдг рдорд┐рд▓рд╛ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдкрд░реАрдХреНрд╖рдг OutOfLine рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдпрд╣ рднреА рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╢ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рднрд╛рд╡ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕ рддрд░рд╣ OutOfLine рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХреИрд╢ рдХреЛ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рд╕реЗ рдореБрдХреНрдд рд░рдЦрдирд╛ рдмрд╛рдХреА рдХреЗ рдХреЛрдб рдореЗрдВ рдЬрдЯрд┐рд▓, рдФрд╕рдд рджрд░реНрдЬреЗ рдХрд╛, рд╡реНрдпрд╛рдкрдХ рд╕реБрдзрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдореЗрд╢рд╛ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде, рдорд╛рдиреНрдпрддрд╛рдУрдВ рд╕реЗ рдЕрдзрд┐рдХ рдорд╛рдк рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░реЗрдВ, рдлрд┐рд░ рднреА рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ OutOfLine рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧреА рдЙрдкрдХрд░рдг рд╕рд╛рдмрд┐рдд рд╣реЛрдЧрд╛ред


рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ рдзреНрдпрд╛рди рджреЗрдВ


рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рд╡рд┐рдЪрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред

Source: https://habr.com/ru/post/hi421475/


All Articles