现在的位置: 首页 > 综合 > 正文

C/C++ 变量在内存中的存储

2013年12月01日 ⁄ 综合 ⁄ 共 1950字 ⁄ 字号 评论关闭

首先是寄存器变量存放在寄存器中,

其他的变量存放在内存中,下表为内存布局


高内存地址

向下增长,可读可写可执行

空洞

向上增长

向上增长,可读可写可执行

BSS段(未初始化数据段)

向上增长,可读可写不可执行

.data 数据段

向上增长,可读可写不可执行

.text 文本段(代码段)

向上增长,可读可写不可执行


低内存地址 

auto 存储类指明符--用于说明具有局部作用域的变量,它表示变量具有局部(自动)生成期,但由于它是所有局部作用域变量说明的缺省存储类指明符,所以使用得很少。要注意的是,所有在函数内部定义的变量都是局部变量,函数内部定义的变量其作用域只在函数内部。它的生存期为该函数运行期间,一旦离开这个函数或这个函数终止,局部变量也随之消失。

register 存储类指明符--当声明了这个指明符后,编译程序将尽可能地为该变量分配CPU内部的寄存器作为变量的存储单元,以加快运行速度。注意,寄存器与存储器是不同的。寄存器一般在CPU内部,而存储器一般指外部的(比如内存条),CPU内部的寄存器其运算速度是很高的。当寄存器已分配完毕,就自动地分配一个外部的内存。它的作用等价于auto,也只能用于局部变量和函数的参量说明。 

static 存储类指明符--表示变量具有静态生成期。static变量的的特点是它离开了其作用域后,其值不会消失。 当回到该作用域之后又可以继续使用这个static变量的值。 

 1)变量可以存储在内存的不同地方,这依赖于它们的生成期。在函数上部定义的变量(全局变量或static外部变量)和在函数内部定义的static变量,其生存期就是程序运行的全过程。这些变量被存储在数据段(Data Segment)中。数据段是在内存中为这些变量留出的一段大小固定的空间,它分为二部分,一部分用来初始化变量,另一部分用来存放未初始化的变量。

2)在函数内部定义的auto变量(没有用关键字static定义的变量)的生成期从程序开始执行其所在的程序块代码时开始,到程序离开该程序块时为止。作为函数参数的变量只在调用该函数期间存在。这些变量被存储在栈(stack)中。栈是内存中的一段空间,开始很小,以后逐渐自动变大,直到达到某个预定义的界限。

 3)当用malloc等函数给指针分配一个地址空间的时候,这个分配的内存块位于一段名为“堆(heap)”的内存空间中。堆开始时很小,但调用malloc或clloc等内存分配函数时它就会增大。堆可以和数据段或栈共用一个内存段,也可以有它自己的内存段,这完全取决于编译选项和操作系统。与栈相似,堆也有一个增长界限,并且决定这个界限的规则与栈相同。

示例:

#include <stdio.h>

#include <unistd.h>
      main ()
       {
        register int a = 2;
        const int b = 3;
        int c = 3;
        printf ("%d\n", getpid());
        while (1);
}

可以设置这样的死循环,然后进入/proc下查看进程id中的maps, 如下:

00154000-002ab000 r-xp 00000000 08:02 3368534    /lib/libc-2.5.so
002ab000-002ad000 r-xp 00156000 08:02 3368534    /lib/libc-2.5.so       
002ad000-002ae000 rwxp 00158000 08:02 3368534    /lib/libc-2.5.so
002ae000-002b1000 rwxp 002ae000 00:00 0 
00787000-007a2000 r-xp 00000000 08:02 3368527    /lib/ld-2.5.so
007a2000-007a3000 r-xp 0001a000 08:02 3368527    /lib/ld-2.5.so
007a3000-007a4000 rwxp 0001b000 08:02 3368527    /lib/ld-2.5.so
00eec000-00eed000 r-xp 00eec000 00:00 0          [vdso]
08048000-08049000 r-xp 00000000 08:02 915954     /root/Desktop/test/a.out
08049000-0804a000 rw-p 00000000 08:02 915954     /root/Desktop/test/a.out
b7fcf000-b7fd1000 rw-p b7fcf000 00:00 0 
b7fda000-b7fdb000 rw-p b7fda000 00:00 0 
bf90d000-bf922000 rw-p bffe9000 00:00 0          [stack]


 

抱歉!评论已关闭.