0

0

C++20对智能指针有哪些改进 新特性和使用模式更新

P粉602998670

P粉602998670

发布时间:2025-08-07 10:55:01

|

386人浏览过

|

来源于php中文网

原创

c++++20并未引入新智能指针类型,但通过增强现有功能提升安全性与效率。1. 扩展constexpr支持,使智能指针可用于编译期场景,建议标记构造函数为constexpr并确保删除器兼容。2. 优化shared_ptr多线程性能并支持原子操作,建议使用std::atomic_store等函数避免手动加锁。3. 借助concepts和泛型lambda简化删除器写法,建议用std::type_identity_t和concepts约束类型特征。4. 更好集成模块系统,减少依赖并推荐在模块接口中返回智能指针以隐藏实现细节。

C++20对智能指针有哪些改进 新特性和使用模式更新

C++20在智能指针方面的改进虽然没有引入全新的智能指针类型,但通过增强现有工具和语言整体能力,使得使用智能指针更加安全、高效,并提升了代码的可读性和维护性。以下是一些关键点:

C++20对智能指针有哪些改进 新特性和使用模式更新

1. 更好的 constexpr 支持

C++20扩展了

constexpr
的适用范围,包括一些 STL 组件和算法。这也间接影响了智能指针的使用场景,尤其是在编译期常量表达式中。

C++20对智能指针有哪些改进 新特性和使用模式更新

例如,在某些模板元编程或静态初始化场景中,你可以更自然地结合

unique_ptr
shared_ptr
使用 constexpr 函数,前提是它们的操作满足编译期要求。

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

建议:

C++20对智能指针有哪些改进 新特性和使用模式更新
  • 如果你在编写需要在编译期处理的数据结构,并且涉及资源管理,可以尝试将构造函数或辅助函数标记为
    constexpr
  • 确保使用的删除器(deleter)也支持
    constexpr
    ,否则会导致编译错误

2. 对 shared_ptr 和 weak_ptr 的优化与改进

C++20并没有对

shared_ptr
weak_ptr
的接口做重大变更,但在底层实现上做了性能优化,特别是在多线程环境下的引用计数操作上更为高效。

此外,C++20 引入了

std::atomic
std::atomic
的完整支持,使得在并发环境中使用共享指针更加安全。

使用模式更新:

Magic Eraser
Magic Eraser

AI移除图片中不想要的物体

下载
  • 在多线程环境下进行
    shared_ptr
    的原子操作时,可以直接使用
    std::atomic_load
    std::atomic_store
  • 避免手动加锁来保护
    shared_ptr
    的赋值和访问,转而使用标准库提供的原子操作函数。
std::atomic> ptr;

void update() {
    auto p = std::make_shared(42);
    std::atomic_store(&ptr, p);
}

3. 更灵活的删除器(Deleter)支持

虽然这个特性在 C++11 就已存在,但 C++20 结合 Concepts 和泛型 lambda 表达式,让自定义删除器的写法更简洁、类型约束更明确。

建议:

  • 使用泛型 lambda 作为删除器时,可以用
    std::type_identity_t
    来简化模板参数推导。
  • 如果你希望限制删除器的类型特征,可以借助 Concepts 检查删除器是否满足特定条件,比如是否是无状态的。

示例:

auto deleter = [](int* p) { delete p; };
std::unique_ptr ptr(new int(10), deleter);

4. 更好地与模块(Modules)集成

C++20 引入了模块(Modules),这是对传统头文件机制的重大改进。虽然模块本身不直接影响智能指针的行为,但它改变了我们组织代码的方式,进而影响到智能指针的使用习惯。

实际影响:

  • 模块可以帮助减少不必要的头文件依赖,避免因包含
    而引入过多间接依赖。
  • 在模块接口中返回
    unique_ptr
    shared_ptr
    成为一种推荐做法,因为这样可以隐藏实现细节,提升封装性

例如:

export module mymodule;

import ;

export class MyClass {
public:
    static std::unique_ptr create() {
        return std::make_unique();
    }
private:
    MyClass() = default;
};

总的来说,C++20 对智能指针的改进更多体现在底层性能、并发支持和语言集成方面,而不是直接新增功能。这些变化让开发者在使用智能指针时能写出更安全、高效的代码,同时也能更好地利用现代 C++ 的新特性。

基本上就这些。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1468

2023.10.24

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

204

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

190

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

49

2026.01.05

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

535

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

21

2026.01.06

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1024

2023.10.19

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.9万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.8万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号