系列文章目录
文章目录
前言
与C语言相比
更关注性能
- 与底层硬件紧密结合
- 对象生命周期的精确控制
- Zero-overhead Abstraction
引入大量特性,便于工程实践
- 三种编程范式:面向过程、面向对象、泛型
- 函数重载、异常处理、引用
一、与底层硬件紧密结合
- 如图,一个格子表示一个字节,多字节保存时存在一个问题,一个数据存储时是从低位地址开始存储还是从高位存储呢?
- 我们可以测试一下,经过测发现测试的计算机是小端存储的。
二、对象生命周期的精确控制
- C++在try之后如果出现错误就会立刻销毁对象。
- C#或其他语言在try出现错误后会消耗资源等待程序结束后在finally销毁。
三、zero-overhead abstraction
不需要为没有使用的语言特性付出成本
- 堆栈
- 编译期与运行期
比如分别在堆(new)和栈上开辟内存空间。
那么两者有什么区别呢
-
堆
-
栈
在堆上开辟空间的变量在访问的时候还要找到目标的地址
再取变量。
而在栈上开辟可以直接访问。
明显后者效率更高
但问题是不是所有语言都这样访问内存。
使用一些语言特性不等于付出运行期成本
C++代码有编译期与运行期的概念
如上图所示
consteval auto修饰的函数仅在编译期运行不在运行期运行
那么我们一次编译完成之后,每次运行都只执行
mov eax 990这一步操作
大大提升了运行效率。
C++ 的改进
平均每三年改进一次
- C++98/03
- C++11:引入内存模型、多线程、正则表达
- 引入type_traits
- C++14:改进上述特性等等
- C++17:从标准库删除auto_ptr
- C++20:引入ranges
工业界实现
光有标准还不够,要将代码编译出来还需要具体的实现。
- MSVC(windows)/GCC(linux)/Clang(linux)
- 每个编译器可能并不完全遵照标准,同一个代码在不同的编译器中的表现可能不同。
clang10中不能识别consteval关键字将其编译了
clang11识别到了consteval关键字没有进行编译
总结
- 不能脱离具体的语境讨论C++
- 编写程序时要注重
- 性能
- 标准