gpt4 book ai didi

c++ - 抽象接口(interface)的单个​​派生是否会内联它的虚函数?

转载 作者:行者123 更新时间:2023-11-30 01:11:02 24 4
gpt4 key购买 nike

我有一个纯虚基类作为接口(interface)

struct Interface
{
virtual void foo() = 0;
};

这个接口(interface)我有2个派生,1个用于生产,1个用于测试

struct Production : Interface
{
void foo() override;
};

struct Test : Interface
{
void foo() override;
};

在我的代码库中,我到处都使用Interface

void bar(Interface& i)
{
i.foo();
}

但是,在我的生产二进制文件中,只有一个 Interface 派生,即 Production

当编译我的生产二进制文件时,编译器/链接器/优化器是否会看到对于 Interface::foo() 的每次调用,它实际上是对 Production::foo( ),并内联虚函数调用?

如果是这样,我在不同的静态库中编译它们有关系吗?即:静态库只看到Interface,但是在链接时,链接器知道它是一个Production

我目前正在使用 gcc-4.9.2

最佳答案

了解此特定案例的唯一方法是查看生成的代码以找出答案。

也就是说,g++ 4.9 添加了一个 -fdevirtualize 开关,它的目的就是为了做到这一点,至少在正确的情况下(我已经测试过它并发现它确实有效的情况)。

它是由 Honza Hubička 用 g++ 实现的,他在他的博客中写了一些关于它的内容:

http://hubicka.blogspot.com/2014/01/devirtualization-in-c-part-1.html http://hubicka.blogspot.com/2014/01/devirtualization-in-c-part-2-low-level.html http://hubicka.blogspot.com/2014/02/devirtualization-in-c-part-3-building.html http://hubicka.blogspot.com/2014/02/devirtualization-in-c-part-4-analyzing.html

如果你读了这些,你就会明白为什么 Crazy Eddie(例如)对任何人这样做持怀疑态度——尽管它已经完成,并且确实有效,但实现显然并非易事.

就编写代码而言:由于无论如何您都不期望任何运行时多态性,您可能会考虑改用基于模板的解决方案。

struct Production 
{
void foo();
};

struct Test
{
void foo();
};

template <class Interface>
void bar(Interface& i)
{
i.foo();
}

当然,在大多数情况下,您最终会将 Interface 作为类模板的参数,而不是函数模板,但基本思想保持不变——您定义您的 >TestProduction 版本具有相同的接口(interface)(但使用基类或虚函数),然后实例化 Test 测试时的版本和 Production 生产代码的版本。当然,这基本上始终适用于任何编译器,而不仅仅是在正确情况下使用正确的编译器。

关于c++ - 抽象接口(interface)的单个​​派生是否会内联它的虚函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36509442/

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