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

  • 相关阅读:
    LINUX 环境变量总结
    make的自动变量和预定义变量
    函数调用约定和堆栈
    如何查看linux命令源代码
    shell脚本中特定符合变量的含义
    【转载】Redhat5和6 YUM源配置的区别
    用路径分析法来编写测试用例
    linux ip 设置
    Mysql 的存储引擎,myisam和innodb的区别。
    一些编译php时的configure 参数
  • 原文地址:https://www.cnblogs.com/xkfz007/p/2607224.html
Copyright © 2011-2022 走看看