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


     
  • 相关阅读:
    模拟退火求二维费马点
    二叉查找树
    Linux中让普通用户拥有超级用户的权限
    python 正则表达式应用——缩写词扩充
    解决单链表中的环问题
    python数学函数
    train,dev,test数据集作用
    朴素贝叶斯法(二)——基本方法
    生成模型与判别模型
    ImportError: cannot import name wordnet
  • 原文地址:https://www.cnblogs.com/helloweworld/p/3174044.html
Copyright © 2020-2023  润新知