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