gpt4 book ai didi

c++ - 编译器是否为未使用的类生成 vtable

转载 作者:搜寻专家 更新时间:2023-10-31 01:39:18 25 4
gpt4 key购买 nike

你能解释一下编译器是否为一个有虚函数的类生成了 vtable 并且没有使用那个类(对象不是以任何形式创建的)。比如说,

    class A {
public:
virtual void func() { }
};
int main()
{
return 0;
}

对于上面的程序,编译器是否为 A 类创建 vtable?这可能是一个重复的问题,但我想知道解决方案。如果重复,请提供源链接。

最佳答案

我花了一些时间在 gcc.godbolt.org service (非常感谢@RudolfsBundulis)尝试在哪些情况下让编译器生成虚拟表以满足我的好奇心。

class A {
public:
virtual void func() { }
};

class B : public A {
public:
void func() final override {};
};

int main()
{
return 0;
}

抽象类的任何声明甚至它们的实现都不会使编译器创建所有内容(即使是这些类!)。但是,这也取决于编译器的优化级别:

  1. -O1 在任何编译器上生成这样的 main:

    int main()
    {
    A *a = new B;
    return 0;
    }
  2. -O2 允许生成 vtable 和其他内容,但不适用于任何编译器。我检查了最新的 clang(3.6、3.7)和 gcc(4.9.2、5.1.0),它仅由 gcc 4.9.2 生成。

  3. -O3 on clang (3.6, 3.7), gcc (5.1.0) 不生成任何东西。但是,除非您有实际通话,否则他们会这样做:

    int main()
    {
    A *a = new B;
    a->func();
    return 0;
    }

    但请注意,即使使用 -O3 并且没有调用 a->func()gcc 4.9.2 仍会生成它!

因此,答案与@tenfour 所说的一样——它确实依赖于编译器,取决于它的优化级别,甚至取决于编译器的版本。在这项研究中,非常有趣的是 gcc 4.9.2 仍然编译它,尽管它不是真正需要的,尽管这种行为在 gcc 5.1.0 中已修复。

关于c++ - 编译器是否为未使用的类生成 vtable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31430540/

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