讲师中心 微信公众号
AI工具推荐 视频效率加速

C++惰性初始化模式 延迟加载实现

陌明同学_3001

陌明同学_3001

发布时间:2025-08-28 10:13:01

|

868人浏览过

|

来源于php中文网

原创

惰性初始化通过延迟对象创建或计算提升性能。1. 手动控制用指针和标志位,但需注意内存管理;2. 智能指针结合std::call_once实现线程安全初始化;3. 局部静态变量在C++11中线程安全且简洁;4. std::optional配合std::once_flag可延迟计算昂贵值。根据场景选择合适方式。

c++惰性初始化模式 延迟加载实现

惰性初始化(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_;
}

};

立即学习“C++免费学习笔记(深入)”;

说明:对象在第一次调用 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++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载

局部静态变量:C++11 静态初始化线程安全

C++11 起,函数内的局部静态变量初始化是线程安全的,且只在首次调用时构造。

示例:

class ServiceLocalStatic {
public:
    HeavyObject& getInstance() {
        static HeavyObject instance; // 首次调用时构造
        return instance;
    }
<pre class='brush:php;toolbar:false;'>void use() {
    getInstance().doWork();
}

};

立即学习“C++免费学习笔记(深入)”;

说明:简洁、线程安全、自动管理生命周期。适用于单例风格的惰性初始化。

延迟计算值的惰性加载

有时需要延迟计算某个值,而不是对象构造。

示例:

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 适合复杂对象和线程安全需求。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5199

2023.08.02

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

1918

2023.09.20

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

616

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

351

2025.11.27

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

299

2026.04.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

3518

2023.08.10

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

20

2026.09.23

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

0

2026.09.23

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

0

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn