C++
文章平均质量分 71
C++特性笔记
jiang_T
无无无
展开
-
[C++]智能指针的实现
注:源码来源为 llvm/llvm-project使用智能指针时我们所包含的头文件为<memory>,而关于shared_ptr<T>的类定义实际上在shared_ptr.h中,为了便于理解,此处仅从源码中截取出其部分构造函数、成员变量以及重载的赋值运算符:template<class _Tp>class shared_ptr{private: element_type* __ptr_; // 所管理的对象内存的指针 __shared原创 2021-12-21 12:19:03 · 563 阅读 · 0 评论 -
[C++] 智能指针
智能指针智能指针shared_ptr——共享的智能指针shared_ptr 的使用方法4种初始化方式获取原始指针管理动态数组时指定删除器需要特别注意的问题unique_ptr——独占的智能指针unique_ptr 的使用方法unique_ptr 的特性weak_ptr——弱引用的智能指针weak_ptr 的使用方法智能指针的多线程安全问题智能指针C++11之前我们必须自己通过调用new和delete来管理堆内存的申请和释放,但是一些情况下很容易忘记调用delete导致出现内存泄漏问题,亦或是出现二次释放原创 2021-10-24 12:34:21 · 114 阅读 · 0 评论 -
[C++]Lambda表达式
基本语法Lambda表示式即匿名函数,用于临时创建一个函数进行处理。基本构成为:[捕获列表](参数列表)->返回类型{函数体}举例:int main(){ auto Add = [](int a, int b)->int { return a + b; }; std::cout << Add(1, 2) << std::endl; //输出3 return 0; }一般来说,编译器可以自动推断出lambda表达式的返回类型,所以可以不显式原创 2021-12-07 12:07:02 · 1225 阅读 · 0 评论 -
[C++] C++11 原子变量
在多线程程序中使用原子变量std::atomic可以非常方便地避免并发访问时的线程安全问题(data races),此外还可以通过指定不同的std::memory_order指定线程间数据同步的粒度。原子变量template <class T> struct atomic;常用方法: void store (T val, memory_order sync = memory_order_seq_cst); // 修改值 T load (memory_order sync = memo原创 2021-11-06 11:45:02 · 1729 阅读 · 0 评论 -
[C++] C++11的异步操作
异步操作—future与promiseC++11 提供了4个与函数异步执行相关的模板类和方法,分别为:std::futurestd::aysncstd::promisestd::packaged_task使用以上类和方法都只需要包含头文件<future>。future 与 async当你需要执行一项任务但目前不需要立刻得到结果时,你可以开启一个单独的线程去执行该任务,并在未来的某个时刻等待这个任务的返回结果。future 与 async 共同为我们提供了实现这种效果的机制。原创 2021-10-27 23:59:29 · 389 阅读 · 0 评论 -
[C++] C++11 条件变量
条件变量C++11 提供了条件变量condition variable用于实现线程间的同步操作,需要包含头文件#include <condition_variable>,并且一般都是与互斥量mutex配合使用。条件变量的工作方式为:使用条件变量的线程首先对互斥量加锁检查某个条件,如果条件不满足,则释放互斥锁量,进入休眠;如果条件满足,则继续执行资源操作,执行完操作后释放互斥量另外一个线程加锁执行资源操作,使条件满足后,释放互斥量,唤醒等待的线程具体参考:std::conditio原创 2021-10-27 15:41:47 · 737 阅读 · 1 评论 -
[C++] mutex 互斥量
mutex 互斥量多线程访问共享资源时,为了保证资源的线程安全,有必要做互斥处理。C++11 的mutex相比于pthread库提供互斥量使用起来更方便灵活。C++11提供如下4种语义的mutex:std::mutex,独占的互斥量。std::time_mutex,带超时的独占互斥量。std::recursive_mutex,递归互斥量。std::recursive_timed_mutex,带超时的递归互斥量。独占的互斥量 mutex常用成员函数lock() ——互斥量加锁。线程调用原创 2021-10-27 14:36:07 · 128 阅读 · 0 评论 -
[C++] C++11 thread线程库
thread 类C++11的支持的thread线程库对原生的pthread库进行了封装,原本pthread_create函数只能传递一个参数,而新的thread类更为灵活。部分构造函数如下,其中复制构造函数都已处于delete状态,不再使用:thread() noexcept = default;thread(thread&& __t) noexcept // 移动构造函数template<typename _Callable, typename... _Args>原创 2021-10-27 11:46:57 · 926 阅读 · 0 评论 -
[C++] 有序容器与无序容器
有序容器与无序容器对比map和unordered_map1 包含的头文件不同2 map的优缺点unordered_map 的优缺点STL参考有序容器 map/multimap 和 set/multiset 内部采用红黑树实现,插入元素时自动排序,可采用中序遍历从小到大遍历元素。C++11 增加了无序容器 unordered_map/unordered_multimap 和 unordered_set/unordered_multiset。内部采用散列表存储数据,通过Hash函数实现元素的快速操作,同时元原创 2021-10-24 16:56:41 · 1925 阅读 · 0 评论 -
[C++] 右值引用和移动语义
右值引用和移动语义深拷贝的性能问题右值引用使用&&来声明方法的参数为右值引用类型移动语义的move方法forward 完美转发emplace_back深拷贝的性能问题如果一个类的构造函数申请了堆内存以存储数据,则必然需要在析构函数中释放堆内存,同时需要定义复制构造函数和重载赋值运算符,实现堆内数据的深拷贝。否则可能导致堆内存的二次释放。但有时候这种深拷贝对于我们的程序来说是非必要的,而且如果存储在堆内的数据量非常大,深拷贝会引起很大的额外性能开销。此时,我们希望有一种方法来避免总是执行原创 2021-10-24 16:21:02 · 2453 阅读 · 0 评论 -
[C++] 关于C++ virtual关键字的总结
关于C++ virtual关键字的总结virtual关键字主要涉及下面几个方面的内容:动态绑定——在基类中,将派生类需要重新定义的函数声明为虚函数,这将有助于实现动态绑定。当基类的指针或引用指向子类的示例并调用某个成员函数时,若该成员函数定义为虚函数,程序将根据对象类型而不是指针或引用的类型来选择虚函数的版本(通过虚函数表vtbl实现);相反如果成员函数定义为非虚,则编译器对非虚函数的调用使用静态绑定,此时会在编译阶段就根据基类指针或引用的类型来选择调用的函数版本,于是就会调用基类的成员函数而不原创 2021-10-23 12:39:34 · 409 阅读 · 0 评论