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

 

更多

posted on 2015-10-02 00:26  Excavator  阅读(286)  评论(0编辑  收藏  举报

导航