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


     
  • 相关阅读:
    实现Bootstrap表格拖拽
    鼠标悬停显示气泡
    JS实现当前选择日期是星期几
    JS实现双击编辑可修改
    数组累计-reduce
    vuex——action,mutation,getters的调用
    正则 二
    常用正则 一
    vuex 的使用 mapState, mapGetters, mapMutations, mapActions
    正则替换所有的 ‘ / ’
  • 原文地址:https://www.cnblogs.com/helloweworld/p/3174044.html
Copyright © 2011-2022 走看看