【问题标题】:Are methods in classes using the 'Curiously Recurring Template Pattern' inlined by a modern c++ compiler类中的方法是否使用现代 c++ 编译器内联的“奇怪重复的模板模式”
【发布时间】:2011-06-08 17:33:37
【问题描述】:

我有一段性能至关重要的代码,我正在考虑使用 CRTP。我的问题是大多数编译器能够在多大程度上优化代码。特别是我想知道编译器是否可以内联(在适当的时候)方法。例如,在以下代码中:

template <class Derived> 
struct Base
{
    void interface()
    {
        // ...
        static_cast<Derived*>(this)->implementation();
        // ...
    }
};

struct Derived : Base<Derived>
{
    void implementation();
};

调用object.interface() 会产生与调用object.implementation() 相同的性能

【问题讨论】:

  • 性能问题在这里真的毫无意义。如果这对您很重要,请检查编译器的汇编器输出 - 编译器可以有效地内联(或不内联)他们喜欢的内容。
  • @Neil Butterworth:我大体上同意你的观点,除了涉及没有多个实现或良好优化器的特定算法或语言的性能问题是相当合理的。例如,我得到了一些关于 CPython 性能问题的优秀答案,我也看到了一些关于算法性能的好问题。
  • @Omnif 算法没有性能——它们的实现有。到那时,我们又回到了特定于实现的问题(算法、其使用和编译器/语言系统)。
  • @Neil Butterworth:如果是这样,那么 O 符号的意义何在?
  • @Omnif O 表示法没有说明性能,只有复杂性。提供一个比 O(N) 慢的 O(1) 算法的实现是微不足道的。

标签: c++ compiler-optimization crtp


【解决方案1】:

绝对可能。当然,只有一种方法可以确定。

【讨论】:

    【解决方案2】:

    打开优化,如果编译器认为这值得内联,是的。

    与动态调度相比,CRTP 的优点在于,从编译器的角度来看,它是一个常规函数调用。

    【讨论】:

    • 我知道它的优点是不需要虚拟表查找,但我想知道整个界面是否被优化掉了。即函数调用和指针解引用。
    • @Ian:我还没有谈到虚拟表。请从字面上理解我的话:“从编译器的角度来看,它是一个常规函数调用”,这意味着它可以并且将会像常规函数调用一样进行任何优化。因此,您关于 CRTP 的问题归结为“当您的编译器内联常规函数调用时”的问题。
    • 感谢您的澄清。然后,我可以从您的答案中推断出(在优化的情况下),对接口和实现的调用由编译器以相同的方式处理。这是正确的吗?
    • @Ian:是的。顺便说一句,如果接口只是一个将调用转发到实现的微小包装器,那么 interface 更有可能在调用站点内联,而不是实现到接口中。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    相关资源
    最近更新 更多