惰性初始化(Lazy Initialization)是一种延迟对象创建或计算直到第一次使用时才执行的设计模式。在C++中,这种模式常用于提升程序启动性能、节省资源,尤其是在对象构造开销大或可能根本不会被使用的情况下。
基本惰性初始化:手动控制最简单的惰性初始化方式是使用指针和布尔标志来控制对象的创建时机。
示例:
class HeavyObject { public: HeavyObject() { /* 耗时初始化 */ } void doWork() { /* 业务逻辑 */ } }; <p>class Service { private: HeavyObject* obj<em> = nullptr; bool initialized</em> = false;</p><p>public: void use() { if (!initialized<em>) { obj</em> = new HeavyObject(); initialized<em> = true; } obj</em>->doWork(); }</p><pre class='brush:php;toolbar:false;'>~Service() { delete obj_; }
};
说明:对象在第一次调用 use() 时才创建。但需手动管理内存,容易出错。
使用智能指针实现线程安全的惰性加载推荐使用 std::unique_ptr 或 std::shared_ptr 避免内存泄漏,并结合 std::call_once 和 std::once_flag 实现线程安全的单次初始化。
示例:
#include <memory> #include <mutex> <p>class ServiceSafe { private: mutable std::shared<em>ptr<HeavyObject> obj</em>; mutable std::once<em>flag flag</em>;</p><pre class='brush:php;toolbar:false;'>std::shared_ptr<HeavyObject> getOrCreate() const { std::call_once(flag_, [this]() { obj_ = std::make_shared<HeavyObject> }); return obj_; }
public: void use() { getOrCreate()->doWork(); } };
说明:std::call_once 保证初始化逻辑只执行一次,即使多个线程同时调用 use()。这是推荐的线程安全惰性加载方式。
局部静态变量:C++11 静态初始化线程安全C++11 起,函数内的局部静态变量初始化是线程安全的,且只在首次调用时构造。
示例:
class ServiceLocalStatic { public: HeavyObject& getInstance() { static HeavyObject instance; // 首次调用时构造 return instance; } <pre class='brush:php;toolbar:false;'>void use() { getInstance().doWork(); }
};
说明:简洁、线程安全、自动管理生命周期。适用于单例风格的惰性初始化。
延迟计算值的惰性加载有时需要延迟计算某个值,而不是对象构造。
示例:
class DataProcessor { private: mutable std::optional<std::string> result_; mutable std::once_flag flag_; <pre class='brush:php;toolbar:false;'>std::string computeExpensiveValue() const { return "computed result"; }
public: const std::string& getResult() const { std::callonce(flag, [this]() { result = computeExpensiveValue(); }); return *result; } };
说明:结合 std::optional 和 std::once_flag 实现延迟计算,适合缓存昂贵的计算结果。
基本上就这些。根据使用场景选择合适方式:局部静态变量最简单,std::call_once 最灵活,智能指针配合 once_flag 适合复杂对象和线程安全需求。
以上就是C++惰性初始化模式 延迟加载实现的详细内容,更多请关注知识资源分享宝库其它相关文章!
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。