C/C++ | 变量的内存分配
C/C++ 程序占用的内存分布:
栈区(stack): 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;
堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由系统回收 ;
全局区(静态区)(static):全局变量和静态变量的存储是放在“一块的”;
文字常量区:这里需要分很多种情况,详情见下面的代码;
程序代码区:存放函数体的二进制代码。
内存低端
| -> 程序段:二进制机器码和只读数据
| -> 数据段:静态数据
| -> 堆栈 :动态数据
内存高端
C++ 中变量是如何分布的呢,直接上代码会比较直观:
1 int global_uninited; 2 int global_inited = 1; 3 4 int main() 5 { 6 static int s_local_uninited; 7 static int s_local_inited = 0; 8 9 int local_inited = 1; 10 int local_uninited; 11 12 char str_static1[8]; 13 char str_static2[] = "abcdEFG"; 14 char *str_dynamic = "abcdEFG"; // ERROR: str_dynamic[2] = 'C'; 15 16 printf("0x%x: global_uninited\n", &global_uninited); // 0x47e008 17 printf("0x%x: global_inited\n", &global_inited); // 0x473000 18 printf("0x%x: s_local_uninited\n", &s_local_uninited); // 0x47e010 19 printf("0x%x: s_local_inited\n\n", &s_local_inited); // 0x47e014 20 21 printf("0x%x: local_inited\n", &local_inited); // 0x28ff1c 22 printf("0x%x: local_uninited\n", &local_uninited); // 0x28ff18 23 24 printf("0x%x: &str_static1\n", &str_static1); // 0x28ff10 25 printf("0x%x: &str_static2\n", &str_static2); // 0x28ff08 26 printf("0x%x: &str_dynamic\n", &str_dynamic); // 0x28ff04 27 printf("0x%x: str_static1\n", str_static1); // 0x28ff10 28 printf("0x%x: str_static2\n", str_static2); // 0x28ff08 29 printf("0x%x: str_dynamic\n\n", str_dynamic); // 0x474027 30 31 return 0; 32 }
16 - 19 行:未初始化的全局变量和局部静态变量(是否初始化无关)是相邻的(隔了4字节)。而初识化的全局变量则预留了约 0xb000 字节空间(?)。
21 - 28 行:函数体内的一般变量、指针变量(动态数组的指针变量也是)、静态数组(整个数组),都放在栈中。而且栈是又高地址往下分配的,所以栈有大小限制。
29 行:动态分配的数据放在堆中
13 - 14 行:字面常量放置的位置在不同情况下会不同,14 行放在堆中,然后指针指向其首地址,指针可变,但其指向的内容是常量,不可变。
关于字面常量的优化:char *str_dynamic2 = "abcDEFG"; // str_dynamic2 == str_dynamic