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


 
posted @ 2013-07-05 17:20  helloweworld  阅读(434)  评论(0编辑  收藏  举报