0. 什么是C++
什么是C++
是C语言的扩展,有如下的两个特性:
- 关注性能
- 与底层硬件紧密结合
- 对象生命周期精确控制
- 零成本抽象(Zero-overhead Abstraction)
- 引入大量利于工程实践的特性
- 三种编程范式:面向过程(Imperative Programming)、面向对象(Object-oriented Programming)、泛型(Generic Programming)
- 函数重载、异常处理、引用
零成本抽象(Zero-overhead Abstraction):
- 不需要为没有使用的语言特性付出成本
- 省略了一些语言特性不等于付出运行期成本:
#include <iostream> consteval unsigned int sum(unsigned int x) { unsigned int result = 0; for(unsigned int i = 0; i < x; ++i){ result += i; } return result; } int main(void) { unsigned int res = sum(4); std::cout << res << std::endl; }
上述代码中,使用了一个C++ 20 的关键字
consteval
,该关键字的作用是让包含该关键字的函数在编译器就被执行,返回结果。这样子增加了编译期间的时间成本,但是可以大幅加快运行期间的速度。使用gcc生成的汇编指令如下:main: push rbp mov rbp, rsp mov eax, 6 pop rbp ret
可以看到,在这里直接返回了结果
6
。注意,上述代码在编译的时候,要指定C++的版本为20才可以,不然会导致编译出错。
g++ -std=c++20 -Wall constevel.cpp -o constevel
- 一系列不断演进的标准集合
- C++ 的标准:98/03、11、14、17、20、23
- 语言本身的改进
- 内存模型(Memory Model)
- Lambda表达式(Lambda Expression)
- 标准库的改进
- type_traits/ranges
- auto_ptr(后被shared_ptr等替代,C++17 中遗弃)
- C++ 标准的工业界实现
- MSVC/GCC/Clang ……
- 每个编辑器可能并不完全遵照标准
- 不同的实现存在差异
注意:
- 不能使用具体的语境讨论C++
- 编写程序时需要注重:
- 性能
- 标准(避免移植的问题,尽量减少平台特化工具的使用)
- 写程序的捷径
- 编程不是学出来,而是练出来的
- 反复应用中积累,忽而有一天就能“顿悟”
- 学习原则
- 从感官到原理
- 从使用别人的到创建自己的
- 必须亲手实践
- 必须学以致用,紧跟实际工作
- 追求实用,不搞“学院派”