vs2012和g++对虚函数表分配的内存大小不一样。。。

神奕 2014-09-03 05:41:28

下面是个简单的多重继承关系:

class Base1
{
public:
virtual void x() { cout << "Base1::x()" << endl; }
virtual void y() { cout << "Base1::y()" << endl; }
virtual void z() { cout << "Base1::z()" << endl; }
};

class Base2
{
public:
virtual void x() { cout << "Base2::x()" << endl; }
virtual void y() { cout << "Base2::y()" << endl; }
virtual void z() { cout << "Base2::z()" << endl; }
};

class Derive : public Base1, public Base2
{
public:
virtual void x1() { cout << "Derive::x1()" << endl; }
virtual void y1() { cout << "Derive::y1()" << endl; }
};


对于 Derive 实例中的虚函数表布局就不说了,相信大家都很清楚。。。

下面是测试代码,VS2012

typedef void(*pFun)(void);

int main()
{
Derive b;
int** vptr = (int**)&b; // 虚函数表地址

// virtual table 1
pFun table1_func1 = (pFun)*((int*)*vptr+0); // vptr[0][0]
pFun table1_func2 = (pFun)*((int*)*vptr+1); // vptr[0][1]
pFun table1_func3 = (pFun)*((int*)*vptr+2); // vptr[0][2]
pFun table1_func4 = (pFun)*((int*)*vptr+3); // vptr[0][3]
pFun table1_func5 = (pFun)*((int*)*vptr+4); // vptr[0][4]

// virtual table 2
pFun table2_func1 = (pFun)*((int*)*(vptr+1)+0); // vptr[1][0]
pFun table2_func2 = (pFun)*((int*)*(vptr+1)+1); // vptr[1][1]
pFun table2_func3 = (pFun)*((int*)*(vptr+1)+2); // vptr[1][2]

// call
table1_func1();
table1_func2();
table1_func3();
table1_func4();
table1_func5();

table2_func1();
table2_func2();
table2_func3();
return 0;
}


但是经过测试,在 g++ 4.8.3 中,必须:

// virtual table 1
pFun table1_func1 = (pFun)*((int*)*vptr+0); // vptr[0][0]
pFun table1_func2 = (pFun)*((int*)*vptr+2); // vptr[0][2]
pFun table1_func3 = (pFun)*((int*)*vptr+4); // vptr[0][4]
pFun table1_func4 = (pFun)*((int*)*vptr+6); // vptr[0][6]
pFun table1_func5 = (pFun)*((int*)*vptr+8); // vptr[0][8]

// virtual table 2
pFun table2_func1 = (pFun)*((int*)*(vptr+1)+0); // vptr[1][0]
pFun table2_func2 = (pFun)*((int*)*(vptr+1)+2); // vptr[1][2]
pFun table2_func3 = (pFun)*((int*)*(vptr+1)+4); // vptr[1][4]


输出结果:

Base1::x()
Base1::y()
Base1::z()
Derive::x1()
Derive::y1()
Base2::x()
Base2::y()
Base2::z()


也就说虚函数表中每个 slot 分配的大小不一样,只是因为编译器的实现不同么?

...全文
142 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
CyberLogix 2014-09-03
  • 打赏
  • 举报
回复
不一样很正常,C++标准没有规定实现细节,各个编译器可以自由发挥
mujiok2003 2014-09-03
  • 打赏
  • 举报
回复
vtable+vptr等本来就是实现者自由选择的,甚至没有用其他技术也是可以的。
神奕 2014-09-03
  • 打赏
  • 举报
回复
引用 1 楼 akirya 的回复:
不一样不很正常的事情么 虚表本来就是编译器自由发挥。
嗯,我只是不确定,所以问一下。。。
  • 打赏
  • 举报
回复
不一样不很正常的事情么 虚表本来就是编译器自由发挥。

64,663

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧