读书人

c++中成员变量指针的大小,该怎么处理

发布时间: 2013-07-08 14:13:00 作者: rapoo

c++中成员变量指针的大小
本帖最后由 chaoguo1234 于 2013-07-07 02:56:22 编辑 c++源码如下:

#include <cstdio>
#include <iostream>
using namespace std;

class Top {
public:
int i;
};

class Left : virtual public Top {
public:
int j;
};
class Right : virtual public Top {
public:
int k;
};

class Bottom : public Left, public Right {
public:
int l;
};

int main() {
Bottom b;
int Top::*tip = &Top::i;
int Bottom::*bip = &Bottom::i;
int Left::*lip = &Left::i;
int Right::*rip = &Right::i;

int Left::*ljp = &Left::j;
int Bottom::*bjp = &Bottom::j;

int Right::*rkp = &Right::k;
int Bottom::*bkp = &Bottom::k;

int Bottom::*blp = &Bottom::l;

cout << "sizeof(tip) = " << sizeof(tip) << endl;
cout << "sizeof(bip) = " << sizeof(bip) << endl;
cout << "sizeof(lip) = " << sizeof(lip) << endl;
cout << "sizeof(rip) = " << sizeof(rip) << endl;
cout << "sizeof(ljp) = " << sizeof(ljp) << endl;
cout << "sizeof(bjp) = " << sizeof(bjp) << endl;
cout << "sizeof(rkp) = " << sizeof(rkp) << endl;
cout << "sizeof(bkp) = " << sizeof(bkp) << endl;
cout << "sizeof(blp) = " << sizeof(blp) << endl;
}


运行结果是除了tip大小时4之外,其他的成员变量指针大小都是8。请问其他成员变量指针里面还存了什么信息,希望用汇编详细解释一下这段代码。万分感激 C++

分享到:
[解决办法]
成员指针的实现由编译器决定,不同的编译器中实现可能不一样的。

成员指针可以分数成员数据指针和成员函数指针。

成员数据指针要处理两种成员:普通数据成员和来自虚基类的数据成员,前者只需要一个地址偏移量就可以了,但后者不行,因为虚基类会在不同派生类中有不同的偏移位置,如果只简单地记载偏移位置,在下面的代码中将无法正确工作。因此,数据成员指针中必须能够保存一些信息以帮助编译器正确地找到该虚基类的起始位置——这个信息通常是一个虚拟表项索引号。


class vbase
{
public:
int d1;
};

public base1 : virtual vbase
{
public:
int d2;
};

public base2: virtual vbase
{
public:
int d3;
};

public derived : public base1, public base2
{
public:
int d4;
};

int main()
{
int base1::*member1 = &base1::d1;//这里确定member1的值
int base2::*member2 = &base2::d1;//这里确定member2的值
derived obj;
obj.d1 = 123;
std::cout << d1.*member1 << "\t
[解决办法]
<< d1.*member2 << std::endl;
//如果member1和member2中只保存一个偏移量信息,这里将至少有一个不会得到正确的值
//因为member1和member2在被赋值时还不知道将被应用到一个derived对象上
//而vbase::i在derived中与在base1和base2至少其一的偏移量一定不同。
//member1和member2在被赋值以前不知道自己会不会用来指向虚基类
//所以,只要有虚基类存在,该类的数据成员指针就不会只是一个整数的大小。
}


成员函数的情况更复杂:
指向普通成员函数只需要保存函数指针
指向虚函数成员时需要保存它在虚拟表中的位置
多继承时有多个虚拟表,需要确定是哪一个
虚继承时虚基类的虚拟表指针在对象中的偏移量不确定,需要保存在成员指针中
成员指针需要能表明当前的取值属于上述哪种情况

读书人网 >C++

热点推荐