类对象的成员变量地址为成员变量在类对象中的偏移量

  • Post author:
  • Post category:其他


最近在看《深度探索C++对象模型》,里面提到:类对象中,成员变量的地址实际上该成员变量在类对象中的偏移量+1(+1是编译器处理的结果),即:类对象中的成员变量地址 = 成员变量在类对象中的偏移量+1(见侯捷翻译的《深度探索C++对象模型》98页)。本着严谨的科学精神,我做了一个实验,以下是我的实验:

类的定义:

class X
{
public:

	void addr(){
		int  X::*pmd = &X::x;
		printf("成员变量相对对象首地址的偏移量:%p\n", pmd);
	} 

	int   x;
};


main函数中的代码:

	X x;
	x.x = 5;
	std::cout << "对象首地址:" << &x << "\n";
	std::cout << "成员变量所在地址:" << &(x.x) << "\n";
	x.addr();


输出结果:

这时我发现,按书中的理论,类对象中的成员变量地址 = 成员变量在类对象中的偏移量 + 1 = 00000001才对,这与实际结果不符。

经过查证得到,书中的知识主要是为了讲解类对象的底层布局,现在各家编译器都有自己的存取策略,有的确实是:类对象中的成员变量地址 = 成员变量在类对象中的偏移量 + 1,有的又是采取其他的策略。因此通过我的实验只能说明,在VC++的编译器中,类对象中的成员变量地址 = 成员变量在类对象中的偏移量。



版权声明:本文为u011201045原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。