#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类中非静态数据成员0x22ff40C++ 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; };