《C++ Primer Plus》学习笔记|第9章 内存模型和名称空间 (24-12-1更新)
文章目录
- 9.1 单独编译
- 9.2 存储持续性、作用域和链接性
- 9.2.3 静态持续变量
- 3种连接性
- 外部链接性
- 内部链接性
- 无链接性
- 9.2.4 静态持续性、外部链接性
- 两种变量声明
- 定义声明
- 引用声明
- 9.2.7 说明符和限定符
- 1. cv-限定符
- const
- volatile
- 2. mutable
- 3.const
- 9.2.9 语言链接性
- C++语言链接
9.1 单独编译
将程序分解为多个源文件(.cpp
文件)和头文件(.h
文件)进行分别编译,然后再链接成可执行程序的机制。这种方式有助于大型项目的组织和管理,提高编译效率。
9.2 存储持续性、作用域和链接性
作用域(scope)描述了名称在文件的多大范围内可见。
链接性(linkage)描述了名称如何在不同单元间共享。
寄存器变量
register in count_fast;
最初由C语言引入,建议编译器使用CPU寄存器,而在C++11之后,这种作用失去了,只是表示该变量是自动存储的。
9.2.3 静态持续变量
3种连接性
int global = 1000; //static duration,external linkage
static intone file=50;//static duration.internal linkage
int main()
{
...
}
void funct1(int n){
static int count=0://static duration,no linkage
int llama =0;
}
外部链接性
可在其他文件中访问
在代码块的外面声明它
内部链接性
只能在当前文件中访问
必须在代码块的外面声明它,并使用static限定符
无链接性
只能在当前函数或代码块中访问
必须在代码块内声 明它,并使用static限定符
9.2.4 静态持续性、外部链接性
链接性为外部的变量通常简称为外部变量,它们的存储持续性为静态,作用域为整个文件。外部变量也称全局变量。
两种变量声明
定义声明
简称定义,给变量分配存储空间
引用声明
简称声明,不给变量分配存储空间,因为它引用已有的变量
引用声明使用关键字extern,且不进行初始化;否则,声明为定义,导致分配存储空间。
如果要在多个文件中使用外部变量,只需在一个文件中包含该变量的定义(单定义规则),但在使用该变量的其他所有文件中,都必须使 用关键字extern声明它。
9.2.7 说明符和限定符
1. cv-限定符
const
volatile
该关键字的作用是为了改善编译器的优化能力。
例如,假设编译器发现,程序在几条语句中两次使用了某个变量的值,则编译器可能不是让程序查找这个值两次,而是将这个值缓存到寄存器中。这种优化假设变量的值在这两次使用之间不会变化。
如果不将变量声明为volatile,则编译器将进行这种优化;将变量声明为 volatile,相当于告诉编译器,不要进行这种优化。
2. mutable
可以用它来指出,即使结构(或类)变量为const,其某个成员也可以被修改
struct data{
char name[30];
mutable int accesses;
}
const data veep="Claybourne Clodde",0,...};
strcpy(veep.name,"Joye Joux");//not allowed
veep.accesses++ // allowed
3.const
const有一些问题,在默认情况下全局变量的链接性为外部的,但const全局变量的链接 性为内部的。也就是说,在C++看来,全局const定义就像使用了static说明符一样。
如果出于某种原因,程序员希望某个常量的链接性为外部的,则可
以使用extern关键字来覆盖默认的内部链接性:
extern const int states = 50; //definition with external linkage
9.2.9 语言链接性
C++语言链接
在 C++中,同一个名称可能对应多个函数,必须将这些函数翻译为不同的符号名称。因此,C++编译器执行名称矫正或名称修饰,为重载函数生成不同的符号名称。