【C++11\14\17\20新特性】
文章平均质量分 82
最近在看《现代C++》顺手做个笔记
越甲八千
置身其中,全力以赴
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
std::vector<>.emplace_back
(而非拷贝或移动)元素。这一特性显著提升了复杂对象的插入效率,尤其适用于构造代价较高的类型。是 C++11 引入的容器成员函数,用于在容器尾部。:若构造函数抛出异常,容器状态保持不变。不返回新元素的引用(C++17 起。在现代 C++ 编程中,建议优先使用。,除非需要明确的类型检查或兼容性保证。:若容器需要重新分配内存,仍需移动所有现有元素。原创 2025-05-20 23:10:31 · 1126 阅读 · 0 评论 -
thread 的mutex优化
std::lock_guard 是 C++ 中用于管理互斥锁的 RAII(Resource Acquisition Is Initialization)工具。它在构造函数中自动加锁,并在析构函数中自动解锁,确保锁的生命周期与对象的作用域绑定。这种设计避免了手动管理锁时可能出现的资源泄漏和死锁问题,尤其在异常情况下仍能保证锁的正确释放。std::lock_guard 的自动解锁机制依赖于 C++ 的作用域规则,局部对象在离开作用域时会自动析构,从而释放锁。相比手动管理锁,std::lock_guard 提供了原创 2025-05-20 22:04:14 · 351 阅读 · 0 评论 -
C++ string_view
是C++17引入的一个轻量级、非拥有的字符串视图类,定义于头文件中。它提供了一种高效且安全的方式来处理字符串数据,而无需复制字符串内容。以下是关于。原创 2025-04-14 15:29:25 · 1048 阅读 · 0 评论 -
STL新增内容
这些新增内容使得 STL 更加完善和强大,为 C++ 开发者提供了更多高效、便捷的工具。原创 2025-04-01 15:55:35 · 497 阅读 · 0 评论 -
C++ register关键字
关键字的主要作用是建议编译器将变量存储在CPU的寄存器中,而不是内存里。寄存器是CPU内部的高速存储单元,和内存相比,寄存器的读写速度要快很多。要是变量被频繁访问,把它放在寄存器里就能显著提升程序的运行效率。会被频繁使用,所以建议编译器把它存到寄存器中。是C和C++编程语言里的一个存储类说明符。原创 2025-03-27 20:40:22 · 681 阅读 · 0 评论 -
std::variant 和enum的区别
枚举(enum枚举是一种用户定义的数据类型,它由一组命名的常量值组成,这些常量值被称为枚举项。每个枚举项都有一个对应的整数值,默认情况下从 0 开始依次递增,也可以手动指定枚举项的值。示例代码如下:// 定义一个枚举类型RED,GREEN,BLUEreturn 0;是 C++17 引入的一个类型安全的联合体(Union),它可以存储多种不同类型的值,但在同一时间只能存储其中一种类型的值。可以包含任意类型,包括用户自定义类型。原创 2025-03-26 13:44:16 · 558 阅读 · 0 评论 -
C++ CAS
它通过比较内存中的值和预期值,如果两者相等,则将内存中的值更新为新值;如果不相等,则表示该值已经被其他线程修改,操作失败。整个比较和交换的过程是原子的,即在执行过程中不会被其他线程中断。CAS 即 Compare-And-Swap,是一种用于实现多线程同步的原子操作。CAS 操作通常是由硬件层面提供支持,例如在 x86 架构中,有专门的指令来实现 CAS 操作,这保证了操作的原子性。CAS 操作通常需要三个参数:内存地址(V)、预期值(A)和新值(B)。原创 2025-03-22 10:02:50 · 720 阅读 · 0 评论 -
C++平凡类型和非平凡类型异同
非平凡类型是不满足平凡类型定义的类型。拥有平凡的默认构造函数:即编译器自动生成的默认构造函数,没有用户自定义的默认构造函数。拥有平凡的拷贝构造函数:编译器自动生成的拷贝构造函数,没有用户自定义的拷贝构造函数。拥有平凡的析构函数:编译器自动生成的析构函数,没有用户自定义的析构函数。若一个类型不满足上述任何一个条件,它就是非平凡类型。原创 2025-03-22 09:25:13 · 710 阅读 · 0 评论 -
C++关键字汇总
在C++里,保留关键字是被语言本身赋予特定含义的单词,程序员不能将它们用作自定义的标识符(像变量名、函数名等)。根据不同的C++标准,保留关键字的数量有所不同。原创 2025-03-21 21:33:19 · 1398 阅读 · 0 评论 -
泛型lambda表达式和普通lambda表达式的区别
综上所述,泛型 lambda 表达式和普通 lambda 表达式各有优缺点,应根据具体的使用场景选择合适的 lambda 表达式类型。泛型 lambda 可以用于打印不同类型容器中的元素,增强了代码的通用性。关键字让它可以接受不同类型的参数,既可以是整数,也可以是浮点数。泛型 lambda 既可以用于整数相加,也可以用于字符串拼接。是一个普通 lambda 表达式,它明确指定了两个参数。是一个泛型 lambda 表达式,原创 2025-03-21 10:15:36 · 386 阅读 · 0 评论 -
C++ 各种map对比
不是标准 C++ 的一部分,如果你使用的编译器不支持。头文件,代码可能无法编译。原创 2025-03-20 00:14:15 · 1504 阅读 · 0 评论 -
compare_exchange_weak功能
函数会将原子变量的当前值与一个期望值进行比较,如果两者相等,则将原子变量的值更新为指定的新值;如果不相等,则将期望值更新为原子变量的当前值。该函数可能会出现伪失败的情况,即即使原子变量的当前值与期望值相等,操作也可能返回false,但这并不影响其在循环中重试以达到最终的更新目的。原创 2025-03-19 20:58:10 · 1179 阅读 · 0 评论 -
compare_exchange_weak 和compare_exchange_strong区别
和都是类提供的成员函数,用于执行原子的比较和交换(Compare-And-Swap,CAS)操作。原创 2025-03-19 14:58:45 · 1040 阅读 · 0 评论 -
std::variant` 的底层实现原理
的核心是通过手动管理存储和类型索引,结合编译时类型计算和运行时动态分派,实现类型安全的联合体。其设计平衡了类型灵活性、内存效率与异常安全性,是C++类型系统的重要扩展。原创 2025-03-17 10:09:57 · 1034 阅读 · 0 评论 -
C++ std::apply
std::apply是 C++17 标准库引入的一个实用函数,它允许你将一个std::tuplestd::pair或者任何支持std::get和的类型(统称为元组式类型)中的元素展开,并作为参数传递给一个可调用对象(如函数、函数对象、lambda 表达式等)。下面从基本概念、使用示例、实现原理和使用场景几个方面详细介绍。原创 2025-03-17 10:04:08 · 667 阅读 · 0 评论 -
C++可变参数容器
可以利用 C++ 的可变参数模板来实现一个简单的可变参数容器。// 可变参数模板类private:public:// 插入元素// 打印元素}, tuple);return 0;原创 2025-03-17 09:59:10 · 335 阅读 · 0 评论 -
C++ lambda表达式
Lambda 表达式的性能和普通函数对象类似,因为它们本质上都是通过函数调用运算符来实现的。由于 Lambda 表达式生成的是内联函数对象,在大多数情况下,编译器可以对其进行很好的优化,使得调用 Lambda 表达式的开销和调用普通函数相差不大。C++ 中的 Lambda 表达式是 C++11 引入的一个重要特性,它允许我们在代码中创建匿名的函数对象,提供了一种简洁且灵活的方式来定义局部的、一次性使用的函数。Lambda 表达式在底层是通过编译器自动生成一个匿名的类(函数对象,也称为仿函数)来实现的。原创 2025-02-06 14:05:28 · 1417 阅读 · 0 评论 -
C++ bind
在C++中,绑定器(Binder)是一种用于将可调用对象(如函数、函数指针、成员函数指针、lambda 表达式等)与其参数进行绑定,从而生成一个新的可调用对象的工具。它允许你将一个可调用对象和其部分或全部参数进行绑定,生成一个新的可调用对象。这个新的可调用对象可以在后续被调用,并且在调用时可以省略那些已经被预先绑定的参数。函数的第一个参数绑定为后续调用时的第二个参数,第二个参数绑定为后续调用时的第一个参数,第三个参数固定为。等,用于表示在后续调用绑定后的可调用对象时,传入的参数将被放置在相应的位置。原创 2025-02-06 13:57:38 · 371 阅读 · 0 评论 -
C++ std::bindfirst
的主要功能是将一个二元函数对象(即接受两个参数的函数对象)的第一个参数固定为一个特定的值,从而生成一个新的一元函数对象。这样在后续调用这个新的一元函数对象时,就只需要提供原来二元函数对象的第二个参数即可。,这是一个用于标记一元函数对象的基类,在 C++11 之前用于提供类型信息,方便其他标准库组件(如算法)使用。等工具提供了更强大和灵活的参数绑定功能,不再依赖于这些固定的类型定义,并且可以处理更复杂的参数绑定和占位符使用等情况。是一个模板参数,表示要绑定的二元函数对象的类型。和一个要绑定的第一个参数的值。原创 2025-02-05 15:57:35 · 777 阅读 · 0 评论 -
C++ std::move
std::move的核心思想就是利用模板类型推导和类型转换,将传入的参数强制转换为右值引用类型。这样做的目的是为了在合适的场景下触发移动语义,避免不必要的深拷贝,提高程序的性能。例如,在容器的元素插入操作中,如果使用std::move将对象转换为右值引用,就可以调用对象的移动构造函数或移动赋值运算符,从而更高效地完成元素的插入操作。原创 2025-02-05 14:39:03 · 954 阅读 · 0 评论 -
std::forward
是 C++ 标准库中定义在<utility>头文件里的一个函数模板,它主要用于实现完美转发,也就是在函数模板中能够将接收到的参数(无论是左值还是右值,以及其对应的constvolatile等属性)原封不动地转发给其他函数,保证被转发函数接收到的参数特性和原调用函数传入的参数特性完全一致。下面我们来详细解析其源码实现。原创 2025-02-05 14:21:50 · 792 阅读 · 0 评论 -
C++左值引用、右值引用、引用折叠、移动语义、完美转发
综上所述,左值引用、右值引用、引用折叠、移动语义和完美转发这些概念在 C++11 及后续版本中相互配合,为优化对象资源管理、提高代码性能以及在复杂的模板编程和函数调用场景中保证参数传递的正确性等方面发挥了重要作用,深入理解它们有助于编写更高效、灵活且符合现代 C++ 编程规范的代码。这种形式(称为“万能引用”,后面会详细解释),在实际调用时,根据传入的是左值还是右值,模板参数会进行类型推导,然后结合引用折叠规则来确定最终参数的引用类型,从而保证函数内部转发等操作能正确进行。所指向的可能大量内存数据的开销。原创 2024-08-19 16:18:24 · 252 阅读 · 0 评论 -
C++智能指针 `auto_ptr`、`unique_ptr`、`shared_ptr`、`weak_ptr`、scoped_ptr
总之,C++ 中的这些智能指针各有特点和适用场景,合理使用它们可以帮助我们更方便、安全地管理动态分配的资源,避免内存泄漏、悬空指针等常见的内存管理问题,提升代码的健壮性和可维护性。库(一个很常用的C++ 第三方库,为C++ 标准库提供了许多补充和扩展功能)中提供的一种智能指针,不过在C++11 及之后,库的项目中还能看到它的身影,并且理解它的原理和使用方式对于掌握智能指针以及更好地进行资源管理有很大的帮助。基本涵盖了它的功能并成为了标准库的一部分,以下是对。核心功能的简化源码示例(并非完整的。原创 2025-01-06 11:27:01 · 1155 阅读 · 0 评论 -
C++ 14新特性
函数中,根据传入的布尔值条件返回不同类型的值,C++14 能够正确推导出返回类型,使得编写这样的函数更加简洁,无需显式指定返回类型(当然,前提是编译器能根据代码逻辑明确推导出类型)。在上述代码中,通过数字分隔符把长数字进行了合理划分,使其在代码中更直观地展示数值大小,方便阅读和代码维护,尤其是在处理金融、科学计算等涉及到大数值的领域很有帮助。标记并在函数体中包含了循环语句来计算阶乘,C++14 允许这样的操作,并且可以在编译期完成计算,将结果作为常量表达式使用,展示了放宽。,根据传入的不同类型。原创 2025-01-06 10:53:06 · 1081 阅读 · 0 评论 -
C++ 11新特性
这些只是C++11众多新特性中的一部分,它们为C++编程带来了更多便利、高效以及功能上的拓展,让开发者可以写出更现代、更强大的C++代码。可以让函数或对象在编译期求值,扩大了编译期计算的范围,常用于定义编译期就能确定值的常量、数组大小等,提升程序性能和可预测性。允许在一个构造函数中调用同一个类的其他构造函数,减少代码重复,方便初始化逻辑的复用。,它的语法更加直观、灵活,特别是在定义模板别名等复杂情况时优势明显。可以在代码中创建匿名函数,方便在需要函数对象的地方(如。在派生类中重写基类的虚函数时,可以使用。原创 2024-12-24 08:55:54 · 672 阅读 · 0 评论
分享