最近在看《深度探索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 版权协议,转载请附上原文出处链接和本声明。