Skip to main content

对开发者的要求

设计哲学:Zero Overhead

学习层次

  • 语言只是工具
    • 比如招牌厨师,人家问你熟悉什么菜系,你说自己菜刀运用很精通
    • C++只是工具
  • 操作系统,图形学,网络编程,数据结构和算法,设计模式是各大菜系
    • 操作系统:进程和线程,内存池
  • 流媒体,驱动开发,游戏引擎开发,服务端开发,客户端开发,量化交易是各种美味佳肴(真实需求)

相关知识要求

  • 操作系统的内核
  • 操作系统存储
  • 崩溃一致性
  • 处理器模型
  • IO操作
  • C++的编译工具链

计算机语言

  • 人机交流,为应付复杂程度不断提高的现代编程任务而设计的
  • 计算机语言要处理两个概念
    • 数据:程序使用和处理的信息
    • 算法:程序使用的方法

程序编译过程

graph LR
A(源代码) --> B(编译器)
B --> C(目标代码)
C --> D(链接程序)
D --> E(可执行代码)
H(启动代码) .-> D
I(库代码) .-> D

C++简介

  • C++最初由 Bjarne Stroustrup 于1979年在贝尔实验室开发

  • 1998年,第一个C++标准获得了 ISO 标准委员会的批准

  • C++融合了3种不同的编程方式

    • 在C语言(面向过程编程)的基础上
    • 添加了面向对象编程泛型编程的支持

C++特征

  • 变量区分大小写字符
  • 函数重载,允许创建多个同名函数,条件是它们的参数列表不同
  • 单引号只用于一个字符,双引号用于一个字符串

C++常用头文件

#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <vector>
#include <array>
#include <ctime>
#include <cctype>
#include <fstream>

C++的内存管理

变量和函数都具有存储连续性,即在内存中的存在的时间

  • 自动存储
    • 连续性:在程序块开始时分配内存,在程序块结束时释放内存
    • 特征:通常存储在栈中,执行代码块时,变量依次入栈,离开代码块时,按相反的顺序释放变量,称为后进先出(LIFO)
  • 静态存储
    • 用法
      • 一种是在函数外定义它
      • 一种是在声明变量时使用关键字 static
    • 连续性:在程序启动时分配内存,在程序结束时释放内存
  • 动态存储
    • 用法:
      • 使用 new 手动分配内存
      • 使用 delete 手动释放内存
    • 连续性:在程序启动时分配内存,在程序运行时释放内存
    • 特征:如果使用 new 创建变量后,没有调用 delete,将导致内存泄漏,被泄露的内存将在程序的整个生命周期内都不可使用;极端情况下,可能出现内存耗尽错误,导致程序崩溃;另外这种泄露也会影响其他应用程序,导致崩溃
  • 线程存储(C++11)
    • 用法:
      • 声明变量时使用关键字 thread_local
    • 特征:让程序能够将计算放在可并行处理的不同线程中

C++的作用域

变量和函数在程序中的可见性

  • 全局作用域
  • 函数作用域
  • 块作用域

C++的链接性

变量和函数在不同源文件之间共享的能力

  • 内部链接性
    • 只能在定义它们的源文件中访问
    • 使用关键字 static 定义的全局变量和函数具有内部链接性
  • 外部链接性
    • 可以在多个源文件中访问
    • 全局变量和函数默认具有外部链接性,可以使用关键字 extern 显式指定

C++头文件常包含的内容

不创建变量,只是告诉编译器如何创建该变量

  • 函数原型
  • 结构声明
  • 类声明
  • 模板声明

有特殊的链接属性

  • 使用 #define 或 const 定义的符号变量
  • 内联函数

C++模板

  • 是一种泛型编程工具
  • 可以在不指定具体类型的情况下,编写通用的代码,根据实际情况产生出不同的类型