What & How & Why

这是本文档旧的修订版!


C++ 介绍

第 0 章笔记


什么是C++

关注性能

与底层硬件紧密结合
  • Big Endian vs Little Endian:多字节存储,大数存储高位为 Big Endian,反之是 Little Endian
  • C++ 没有规定使用哪一种方式来存储数据(但 Java 规定了)
  • 相当于把选择权给了硬件
对象生命周期的精确控制
  • C++ 没有垃圾回收机制,需要处理资源
  • 垃圾回收需要额外的系统资源运行

C++ 中的异常处理 只有 try-catch, C# 中有 try-catch-finally. 因为垃圾回收必须要使用 finally。

Zero-overhead Abstraction
  • 不需要为没有使用的语言特性付出成本
    • 虚函数:没有虚函数,就不是抽象类(对应 C#,即便没有派生,也需要付出派生类的成本,因为所有的类都继承于 Object)
      • 不用 new 就不用堆 (C# 会)
    • 使用了一些语言特性不等于付出运行期成本
      • 编译期已经处理了函数逻辑
      • constrval C++ 20 关键字,在编译器内部执行,运行期不执行函数,直接返回结果。
引入大量特性,便于工程实践
  • 一系列不断衍进的标准集合
    • C++98/03 , C++11 , C++14 , C++17 , C++20 , C++23 ?
  • 三种编程范式:面向过程、面向对象、泛型
  • 函数重载、异常处理、引用
  • 语言本身的改进
    • Memory Model(多线程角度 C++ 11)
    • Lambda Expression(C++11)
  • 标准库的改进
    • type_traits / ranges(容器扩展)
    • auto_ptr(C++11 中被智能指针替代)
C++ 标准的工业界实现
不能脱离具体的语境讨论 C++
  • 我使用什么样的标准
  • 我使用什么样的工具
编写程序时要注重
  • 性能
  • 标准:尽量使用跨平台的库(符合标准的库),避免移植问题

C++ 的开发环境与相关工具

  • 编译器:Visual C++ / GCC (G++) / Clang (Clang++)

工具

  • time: 使用 linux 自带的 time 测试程序运行时间

/usr/bin/time

  • valgrind:查内存泄漏
  • Cpp reference
  • Compiler explorer
    • 可以查看程序对应的汇编代码
    • 代码的分颜色:对应汇编和C++源码
    • 可选不同编译器,方便做比较
  • C++ Insights:解释代码(比如 for range 是怎么实现的)
  • youtube
    • cppcon

C++ 的编译 / 链接模型

通常情况下,处理程序的方式有两种:

  1. 简单加工
  2. 编译+链接

简单加工模型

单文件,直接编译:

  • 加工时间长
  • 少量修改也会导致全部重新加工

分块处理



每个文件单独编译,再进行链接

  • 编译耗费资源,但一次输入少
  • 链接输入多,但速度快
  • 便于升级(只需要修改需要的文件即可)

C++ 的编译 / 链接模型