C++各种变量、类型的存储位置
先看看这张图里面五个区域
就我自己的思考来设置一些问答。
1. 首先哪些变量会进行零初始化?
如果没有显示地初始化静态变量,编译器将把它设置为0,在默认情况下,静态数组和结构将每个元素或成员的所有位都设置为0。
2. char *p = "hello" 和 char p[6] = "hello"有什么区别?
char *p = "hello", 对于*(p + 1) = 'a'这条语句是无法执行的,因为hello保存在常量字符串区,当你初始化赋值的时候,这些常量就先在文字常量区开辟一段空间,保存此常量,定义后是不能修改的。以后相同的常量就都在这里了。
char p[6] = "hello",保存在栈区, 可以进行修改,空间由编译器自动分配和释放。
3. 五种变量存储方式?
存储描述 | 持续性 | 作用域 | 链接性 | 如何声明 | 其他信息 |
自动 | 自动 | 代码块 | 无 | 在代码块中 | 比如一些局部变量 |
寄存器 | 自动 | 代码块 | 无 | 在代码块中,使用关键字register | |
静态,无链接性 | 静态 | 代码块 | 无 | 在代码块中,使用关键字static | 在函数内,函数退出,值仍然保留 |
静态,外部链接性 | 静态 | 文件 | 外部 | 不在任何函数内 | extern |
静态,内部链接性 | 静态 | 文件 | 内部 | 不在任何函数内,使用关键字static | 所有函数共用 |
4. const的一些问题。
const修饰的全局变量保存在代码区中,const修饰的局部变量保存在栈段中。
默认情况下,全局变量的链接性为外部的(其他文件要使用这个全局变量加上extern关键字), 而const修饰的全局变量是内部链接的,就像使用了static一样。
5. 存储说明符介绍。
auto——在C++11之前是说明符, 显式指出变量为自动存储,现在是用于类型推断,可以不考虑
register——使用CPU寄存器来存储变量,提高变量访问的速度
static——创建静态的内部链接性、静态无链接性的变量
extern——创建静态外部链接性的变量
thread_local——C++11新增,变量的持续性与线程相同
mutable——可以用它来指出,即使结构(或类)变量为const,其某个成员也可以被修改
6. 栈区的详细说明。
由于自动变量的数目随函数的开始和结束而增减,因此程序必须在运行时对自动变量进行管理。常用的方法是留出一段内存,并将其视为栈。程序使用两个指针来跟踪栈,一个指针指向栈底,另一个指针指向栈顶(下一个可用的内存单元)。当函数被调用时,将自动变量加入到栈中,栈顶指针指向变量后面的下一个可用的内存单元。函数结束时,栈顶指针被重置为函数被调用前的值,从而释放新变量使用的内存。
7. 我之前的一个小小的疑惑
局部变量全部都是存储在栈区的,但是malloc分配的内存在堆区,那么int *p = new int[5];这种应该分配在栈区还是堆区呢?当然是p在栈区,存一个地址,地址对应的地方在堆区。