gpt4 book ai didi

c++ - 使用非虚拟接口(interface)习惯用法,我的非虚拟函数可以/将被内联吗?

转载 作者:太空狗 更新时间:2023-10-29 21:45:53 24 4
gpt4 key购买 nike

我最近决定使用非虚拟接口(interface)惯用语(NVI)在C++中设计接口(interface),主要是为了使用具有默认值的参数(从而避免默认参数是静态绑定(bind)的事实引起的问题).

我为我的类(class)做了一个相当简单的声明,看起来像这样:

class Interface{

public:
void func(Parameter p = 0);
virtual ~Interface();
private:
virtual void doFunc(Parameter p)=0;

};

void Interface::func(Parameter p){ doFunc(p); }
Interface::~Interface() {}

我知道在 header 中提供函数体会自动将函数标记为内联候选者(尽管我不知道将定义放在类外部是否会阻止这种情况发生)。我也知道虚函数没有内联,原因很明显(我们不知道在运行时将调用哪个函数,所以我们显然不能用函数体替换调用)。

那么,在这种情况下,func() 会被标记为内联候选者吗?不是虚函数,但仍然调用一个虚函数。它是否使其可以内联?

附加问题:值得吗?正文仅包含一个语句。

请注意,这个问题是为了了解它而不是到处搜索优化。我知道这个函数只会被调用几次(好吧,就目前而言,所以对于程序的发展还是要谨慎),而且内联是非常多余的,而不是我程序性能的主要关注点。

谢谢!

最佳答案

I know that providing the function body in a header automatically mark a function as candidate for inlining

或多或少;但是您可以通过在类定义中提供函数体来实现,或者如果它在 header 中,则通过显式声明 inline 来实现。否则,该函数受单一定义规则的约束,如果您将标题包含在多个翻译单元中,您将收到错误。

请注意,这并不强制编译器内联所有对该函数的调用;在标题中提供定义只允许它在包含标题的任何翻译单元中内联它,如果它认为这是值得的话。此外,一些编译器可以执行“整个程序优化”和内联函数,即使在调用站点定义不可用也是如此。

Then, in this case, will func() be marked candidate for inlining ? It isn't a virtual function, but still calls a virtual function. Does it make it inline-able ?

是的,所有函数都可以内联。如果他们调用自己,那么显然你不能内联所有的调用;也不会在编译时不知道该函数(例如,因为它必须以虚拟方式调用,或通过函数指针调用)。在这种情况下,内联函数会将对 func() 的直接调用替换为对 doFunc() 的虚拟调用。

请注意,如果动态类型在编译时已知,有时可以内联虚拟调用。例如:

struct MyImplementation : Interface {/*whatever*/};
MyImplementation thing;
thing.func(); // Known to be MyImplementation, func and doFunc can be inlined

Extra question: would it be worth it ?

这取决于“它”是什么。如果您指的是编译时间,那么只要函数保持简短,您可能会以微不足道的成本获得一些好处(如果函数被多次调用,可能会很重要)。如果您指的是花时间选择放置位置的成本,那么可能不是;把它放在最方便的地方。

关于c++ - 使用非虚拟接口(interface)习惯用法,我的非虚拟函数可以/将被内联吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16560391/

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