zoukankan      html  css  js  c++  java
  • 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 的内容是一致的,而这种字符串时分配在静态区域的,所以,两者指向了同样的地址位置。

  • 相关阅读:
    P1030 求先序排列 P1305 新二叉树
    spfa
    Clairewd’s message ekmp
    Cyclic Nacklace hdu3746 kmp 最小循环节
    P1233 木棍加工 dp LIS
    P1052 过河 线性dp 路径压缩
    Best Reward 拓展kmp
    Period kmp
    Substrings kmp
    Count the string kmp
  • 原文地址:https://www.cnblogs.com/xkfz007/p/2607224.html
Copyright © 2011-2022 走看看