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

  • 相关阅读:
    SpringBoot常用注解(二)
    SpringBoot常用注解(一)
    Spring Dl解释
    Spring 入门程序
    Spring 入门
    JUnit-4.13使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
    测试中Android与IOS分别关注的点
    python包中__init__.py的作用
    python自动发送测试报告(五)
    搭建一个有条理的项目(四)
  • 原文地址:https://www.cnblogs.com/xkfz007/p/2607224.html
Copyright © 2020-2023  润新知