zoukankan      html  css  js  c++  java
  • C++数据成员的内存布局

    #include <iostream>
    using namespace std;

    class Test
    {
    public:
        int stra;
        static int sta;//静态数据成员并不会介入对象内存布局。
        int strb;
        int strc;
    };
    int Test::sta = 1;

    int main()
    {
        int a;
        int b;
        int c;
        Test s;

        cout << "局部变量" << &a << endl; //函数里的局部变量先入栈的在高地址。
        cout << "局部变量" << &b << endl;
        cout << "局部变量" << &c << endl;

        cout << endl;

        cout << "类中非静态数据成员" << &s.stra << endl; //class struct中的数据成员先声明的在低地址。
        cout << "类中静态数据成员" << &s.sta << endl;   //静态数据成员并不会介入对象内存布局。
        cout << "类中非静态数据成员" << &s.strb << endl;
        cout << "类中非静态数据成员" << &s.strc << endl;

        return 0;
    }
     

    局部变量0x22ff4c
    局部变量0x22ff48
    局部变量0x22ff44

    类中非静态数据成员0x22ff38
    类中静态数据成员0x402000
    类中非静态数据成员0x22ff3c
    类中非静态数据成员0x22ff40

     
     
     
     

    C++ Standard 要求,在同㆒个 access section  (也就是 private、public、protected 等
    区段),members 的排列只需符合「较晚出现的 members 在 class object ㆗有较高的地址」 这㆒条件即可,各个 members 并不㆒定得连续排列。

     

    1、同一个访问权限中,较晚出现的数据成员具有较高的地址;

    2、数据成员并不一定连续排列;

    3、静态数据成员并不会介入对象内存布局。

    4、“vptr一般出现在数据成员的最后,但是也有编译器将其放在数据成员的最前面。”

    5、C++ 标准允许不同访问权限的数据成员自由排列,如下例

    z在内存布局中可能出现在y的前面,“但是据我所知,目前没有任何编译器这么做”。

    class Point3d {
    public:
    // ...
    private:
    float x;
    static List<Point3d*> *freeList;
    private:
    float y;
    static const int chunkSize = 250;
    private:
    float z;
    };


     
  • 相关阅读:
    C++ 虚函数表解析
    C#编写简单的聊天程序
    c#事件与委托
    c#文本控件实现换行
    docker 详细安装及问题排查
    hadoop命令行
    Spark中的多线程并发处理
    CDH6.1.0离线安装——笔记
    linux 常用命令
    Rsync 恢复 libselinux.SO.1
  • 原文地址:https://www.cnblogs.com/helloweworld/p/3174044.html
Copyright © 2011-2022 走看看