首先明确几点:
1)c++标准要求,在同一个access section(private,protect,public)中members的排列只需要符合较晚出现的members在class object中较高的地址这一条即可。也就是说,members不一定要连续排列,什么东西可以插入到members中间呢,填充padding,以及虚函数表指针。
现在很多编译器把虚表指针放在class object的最前端,以前传统方式都是放在显式声明的members的最后喔。
class MyClass
{
public:
MyClass();
~MyClass();
private:
int a;
int b;
int c;
};
因为三个int变量在同一个access section中,所以他们在内存中的顺序是按照这个声明顺序排列的,但是他们中间之间可以插入编译器产生的内部变量,比如虚函数表指针。
2)c++标准也允许编译器将多个access section中的dadta members自由排列,不必在乎他们在class中声明的顺序;
class MyClass
{
public:
MyClass();
~MyClass();
private:
int a;
private:
int b;
private:
int c;
};
a,b,c可以按照任意顺序排列,因为它们在不同的access section中,但是目前编译器都是把一个以上的access section连锁在一起,依照声明的顺序,成为一个连续区域,access section的多寡并不会带来额外的负担,它们大小跟在一个section中是一样的。
这个函数可以看出两个成员变量前后顺序
template<class class_type, class type1, class type2>
void access_order(type1 class_type::*p1, type2 class_type::*p2) {
//assert(p1 != p2);
printf("p1 is:%d\n", p1);
printf("p2 is:%d\n", p2);
if (p1 < p2) {
printf("p1 is first\n");
return;
}
printf("p2 is first\n");
}
class MyClass
{
public:
int a;
int b;
int c;
}
int main()
{
access_order(&MyClass::c, &MyClass::b);
}