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#xn",a);
    printf("s :%0#xn",s);
    printf("s2:%0#xn",s2);
    printf("s3:%0#xn",s3);
    printf("f :%0#xn",&f);
    printf("d :%0#xn",&d);
    printf("main:%0#xn",main);

    return 0;
}

程序运行结果如下:

C++中实际的内存分配

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

  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};

C++中实际的内存分配

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

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

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

C++中实际的内存分配

 

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

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

C++中实际的内存分配

C++中实际的内存分配

原文链接: https://www.cnblogs.com/xkfz007/archive/2012/07/24/2607224.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++中实际的内存分配

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/56494

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午7:24
下一篇 2023年2月9日 上午7:24

相关推荐