变量声明:告诉编译器存在此类型的变量。
变量定义:告诉编译器要创建一个变量,并给该变量分配内存空间,定义包含了声明。
extern char cat; //变量声明,存在一个变量,其内存空间为1个字节。
int dog; //变量声明加定义,创建一个变量,给它分配4个字节的内存空间。
函数声明:告诉编译器存在此类型的变量。
函数定义:告诉编译器函数的内容,实质是一堆由CPU执行的指令,定义包含了声明。
类型的定义:告诉编译器创建一个数据类型,定义class、union、struct、enum以及typedef都为此类。
C++程序需要遵循单定义原则(One-Define-Rule,ODR):
对于非内联函数、有外部链接性的变量(在不同命名空间或不同代码块中声明的变量不视为同一变量)在整个程序整个程序中最多存在一个定义。对于类(包括struct、union、enum)和内联函数,在每个翻译单元中最多被定义一次,而且要保证不同翻译单元之间定义的一致性。
注:由于这种规则,编译器允许对于同一个类,如果不同翻译单元拥有不同的定义,有可能会发生错误。对多个静态库共用的头文件进行修改时,只更新部分静态库,可能导致此问题。
c++存储数据的方式根据数据保留在内存中的时间可分为以下三种:
自动存储持续性:函数中的声明变量,从函数开始到结束。
静态存储持续性:在函数外定义和使用static定义的变量,在程序整个运行过程中都存在。
动态存储持续性:用new分配的内存,直到delete为止。
在函数或一个代码块(函数体就是代码块)内部声明的变量,称为局部变量。
默认情况下,局部变量存储持续性为自动,作用域为局部,没有链接性(不能被外部模块引用)。如果添加关键字static,变量存储持续性会变成静态。
在函数外部声明的变量,称为全局变量。
全局变量的存储持续性为静态,作用域为整个文件,链接性为外部。如果添加关键字static,变量链接性变为内部,即不可被外部模块引用。
C++程序在编译过后生成的可执行文件中,有许许多多的段(.text、.data、.rodata、.bss等),在可执行文件被加载时,为了避免空间浪费,有着同样访问权限的段被合并为一个段。从操作系统的角度来说,一个段被映射到一个虚拟内存区域(VMA),运行时所谓的数据段、栈等其实就是这些VMA。
运行时内存分布:
数据段:全局变量、局部静态变量。
代码段:程序指令、字符串常量、全局const变量。
堆:动态分配的内存。
栈:局部变量。