内存模型和名称空
单独编译
C++允许甚至鼓励程序员将组建函数放在独立的文件中。可以单独编译这些文件,然后将它们链接称可执行的程序。
如果修改了一个文件,可以只重新编译该文件,然后将它与其他文件的编译版本链接。(文件在C++标准中可以解释为翻译单元(translation unit))
可以将原本的程序分成三个部分:
- 头文件:包含结构声明和使用这些结构的函数的原形。
- 源代码文件:包含与结构有关的函数的代码。
- 源代码文件:包含调用与结构相关的函数的代码。
可以放在头文件里面的东西:
- 结构声明
- 模板声明
- 被声明为const的数据和内联函数
在使用include调用头文件时,使用双引号而非尖括号。
编译两个源代码的UNIX命令:
CC file1.cpp file2.cpp
使用#ifndef _ #endif 可以避免编译报错(多个结构定义)
#ifndef COORDIN_H_
#define COORDIN_H_
...
#endif
编译器在首次遇到COORDIN_H_时,该名称并没有被定义,所以会执行#ifndef和#endif之间的内容,此时会将结构和该名称定义,在之后的编译过程中,如果再遇到该头文件,则会跳过该段内容
存储持续性、作用域和链接性
四种变量:
- 自动存储持续性。
- 静态存储持续性。函数外部或者使用关键字static
- 线程存储持续性(C++11)。多线程
- 动态存储持续性。new
作用域和链接
- 作用域(scope)描述了名称在文件(翻译单元)的多大范围内可见。
- 链接性(linkage)描述了名称如何在不同单元间共享。
链接性为外部的名称可以在文件间共享,链接性为内部的名称只能由一个文件中的函数共享。
自动存储持续性
默认情况,函数中声明的函数参数和变量的存储持续性也是自动的,作用域为局部,没有链接性。
如果在一个块中定义块外相同名称的变量,那么块外的变量在块内会被隐藏(hide).
自动变量和栈
C++程序内存对自动变量管理的内存类似于数据结构中的栈-252
寄存器变量:register
register int count_fast;
在C++11中,该关键字失去了它本身的含义,只是表示变量是自动的