C++类成员变量在内存中的排列顺序(布局)

首先明确几点:
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);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值