gpt4 book ai didi

c++ - 是否存在类声明虚方法而编译器不需要使用 vptr 的情况?

转载 作者:太空宇宙 更新时间:2023-11-04 15:10:33 25 4
gpt4 key购买 nike

我想知道是否存在编译器不需要将 vptr 分配给实例化对象的可能优化,即使该对象的类型是具有虚方法的类。

例如考虑:

#include <iostream>
struct FooBase
{
virtual void bar()=0;
};

struct FooDerived : public FooBase
{
virtual void bar() { std::cout << "FooDerived::bar()\n"; }
};

int main()
{
FooBase* pFoo = new FooDerived();
pFoo->bar();

return 0;
}

在这个例子中,编译器在编译时肯定知道 pFoo 的类型,所以它不需要为 pFoo 使用 vptr,对吧?是否有更多有趣的情况,编译器可以避免使用 vptr?

最佳答案

基于 Andrew Stein's answer ,因为我想你也想知道什么时候可以避免所谓的“虚函数的运行时开销”。 (存在开销,但它很小,几乎不值得担心。)

确实很难避免 vtable 指针的 space,但可以忽略指针本身,包括在您的示例中。因为 pFoo 的初始化在那个范围内,所以编译器知道 pFoo->bar 一定意味着 FooDerived::bar,而不是需要检查vtable。还有几种缓存技术可以避免多次 vtable 查找,从简单到复杂。

关于c++ - 是否存在类声明虚方法而编译器不需要使用 vptr 的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2336107/

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