C++中实际的内存分配

这儿所讨论的是x86机器下的内存分配。其他机器下的情况可能不一样。

首先,下面是一段测试程序:

#include <cstdio>
using namespace std;
int main(){
    int a[]={1,2,3,4,5,0,-5,-4,-3,-2,-1};
    char *s="hello world";
    char *s2="I'm a boy";
    char *s3="hello world";
    float f=1.0f;
    double d=1.0;
    printf("a :%0#x\n",a);
    printf("s :%0#x\n",s);
    printf("s2:%0#x\n",s2);
    printf("s3:%0#x\n",s3);
    printf("f :%0#x\n",&f);
    printf("d :%0#x\n",&d);
    printf("main:%0#x\n",main);

    return 0;
}

程序运行结果如下:

从上面的图中可以看到几点:

  1. 三个字符串s,s2和s3的地址最高。高于main函数。
  2. 其他三个变量整型数组a,float变量f和double变量d的地址是变化为从高到低

我们可以推断得到:在x86的机器上,程序的内存增长的方向是由高地址到低地址。三个字符串s,s2和s3是在静态区域分布的,所以内存位置比较高。三个局部变量a,f和d是在栈上进行内存分配的(栈的增长方向也是从高地址到低地址)

数组a在内存中的分布:

int a[]={1,2,3,4,5,0,-5,-4,-3,-2,-1};

因为x86的机器是小端,字节的低位存储在低位地址上,所以出现这样的存储。图中红色方框标出的就是数组中的每一个数字,都是4个字节的。其中-5,内存表示为0xfffffffb,就是第一行最右边和第二行最左边。可以看到数组第一元素的地址是0x0023fe58,低于最后一个元素的地址0x0023fe80.

如果用真实的内存方式展示的话,数组类似下面的分配方式:

该数组为:int i, a[]={1,2,3,4,5};

 

字符串s,s2和s3在内存中:

由于字符串s和s3 的内容是一致的,而这种字符串时分配在静态区域的,所以,两者指向了同样的地址位置。

posted @ 2012-07-24 21:20  Mr.Rico  阅读(...)  评论(...编辑  收藏