要理解移动语义和完美转发,首先必须理解:
右值引用
万能引用和引用折叠
移动语义
移动语义和拷贝语义相对的,移动语义可以将资源从一个对象转移到另一个对象,这样能够减少不必要的临时对象的创建、拷贝以及销毁。
完美转发的实现主要依赖于两个关键要素:右值引用和移动构造函数/移动赋值操作符。
在转移资源...
阅读更多
引用折叠
引用折叠用于处理当类型别名或模板实例化导致“引用的引用”出现时的情况。
一个模板函数,根据定义的形参和传入的实参的类型,我们可以有下面四中组合:
函数定义的形参类型是左值引用,传入的实参是左值引用(& - &)
函数定义的形参类型是左值引用,传入的实参是右值引用(&...
阅读更多
左值引用
左值引用就是左值的别名,不是变量的别名,而是地址的别名,是与地址建立的一种映射关系。我们可以通过不同的别名访问同一块地址空间。
左值引用并非对象,只是为一个已经存在的对象所起的另外一个名字。
左值引用必须初始化,因为无法令左值引用重新绑定到另外一个对象。一旦初始化完成,左值引用将和他的初始值对象一直...
阅读更多
左值与右值这两个概念是从 C 中传承而来的,左值指既能够出现在等号左边,也能出现在等号右边的变量;右值则是只能出现在等号右边的变量。
左值和右值在 C/C++ 中是表达式(expression)的一种属性,被称为值类别(value categories)。
表达式是指由运算符(operator)和运算对象(op...
阅读更多
RTTI,即Run-Time Type Information(运行时类型信息),是 C++ 提供的一种机制,用于在程序运行时获取和使用多态对象的实际类型信息。
RTTI的作用:
多态性支持: 当使用基类指针或引用指向派生类对象时,能够识别出对象的实际类型。
类型安全转换: 允许在运行时进行(向下)类...
阅读更多
原子操作提供了在多线程环境中无需显式同步就能安全访问共享数据的机制。原子操作是不可分割的操作,要么完全执行,要么完全不执行,不会被其他线程中断。
原子性保证了操作的完整性:
不可中断性:操作在执行过程中不会被其他线程中断
可见性:一个线程对原子变量的修改对其他线程立即可见
有序性:通过内存序约束确...
阅读更多
为什么需要内存模型
开发者编写的代码和最终运行的程序往往会存在较大的差异,而运行结果与开发者预想一致,只是一种假象,之所以会产生差异,原因主要由于:
编译器优化导致的指令重排序
CPU乱序执行
CPU Cache不一致性
关于CPU Cache不一致性:
现代的主流CPU几乎都会包含多个核以及...
阅读更多
C++11引入了std::future和std::promise,为异步编程提供了更结构化的工具。
通过std::async或std::packaged_task启动异步任务。
通过std::promise则用于设置异步操作的结果。
通过std::future获取异步操作的结果。
异步任务的结果...
阅读更多