gpt4 book ai didi

c++ - 为什么 vtable 不能包含重复的函数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:05 25 4
gpt4 key购买 nike

想象一个项目,其中有一个如下所示的接口(interface)类:

struct Interface
{
virtual void f()=0;
virtual void g()=0;
virtual void h()=0;
};

假设在其他地方,有人希望创建一个实现此接口(interface)的类,fgh 都做同样的事情

struct S : Interface
{
virtual void f() {}
virtual void g() {f();}
virtual void h() {f();}
};

然后为 S 生成一个 vtable 将是一个有效的优化,其条目都是指向 S::f 的指针,从而节省了对包装函数的调用 gh

然而,打印 vtable 的内容表明未执行此优化:

S s;
void **vtable = *(void***)(&s); /* I'm sorry. */
for (int i = 0; i < 3; i++)
std::cout << vtable[i] << '\n';

0x400940
0x400950
0x400970

-O3-Os 编译没有效果,在 clang 和 gcc 之间切换也是如此。

为什么会错过这个优化机会?

目前,这些是我考虑过(并拒绝了)的猜测:

  1. vtable 打印代码实际上打印了垃圾。
  2. 性能改进被认为毫无值(value)。
  3. ABI 禁止这样做。

最佳答案

这样的优化是无效的,因为...

// somewhere-in-another-galaxy.hpp
struct X : S {
virtual void f();
};

// somewhere-in-another-galaxy.cpp
include <iostream>
void X::f() {
std::cout << "Hi from a galaxy far, far away! ";
}

如果编译器实现了您的优化,则此代码将无法运行。

Interface* object = new X;
object->g();

我的翻译单元的编译器不知道你的类的内部实现,所以对于 g() 和 h() 它只是将我类的虚函数表引用放入你的类的 VFT 中的相应条目。

关于c++ - 为什么 vtable 不能包含重复的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32338779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com