【问题标题】:Will C++ optimize out empty/non-virtual/void method calls?C++ 会优化空/非虚拟/无效方法调用吗?
【发布时间】:2014-03-17 00:44:02
【问题描述】:

示例代码:

class DummyLock {
public:
    void lock() {}
    void unlock() {}    

};

...

template <class T>
class List {
    T _lock;

    ...
public:
    void append(void* smth) {
        _lock.lock();

        ...

        _lock.unlock();
    }
};

...
List<DummyLock> l;
l.append(...);

那么,如果锁类型是模板类型,它会优化这些方法调用吗?如果不是,那么制作将策略作为模板参数的模板列表的最佳方法是什么(如在 Andrei Alexandrescu C++ 书中)

【问题讨论】:

    标签: c++ templates optimization


    【解决方案1】:

    假设启用了内联(因此“启用了一些优化”),那么是的,任何体面的编译器都应该将这种事情变成零指令。特别是在模板中,因为模板要求[在几乎所有当前的编译器中,至少]编译器“看到”对象的来源。在非模板化的情况下,可能会出现这样一种情况,即您“不合时宜”地声明了空的 lock 代码,而编译器无法知道该函数是空的。

    (在您的 append tho 中使用 void *smth 看起来很吓人 - 我希望您确实打算在实际实现中将其作为第二种模板类型)

    一如既往,当谈到“编译器是否这样做”时,如果它真的很重要,您需要检查您的编译器在这种特殊情况下是否符合您的预期。例如,clang++ -Sg++ -S 会显示您的 append 函数中是否有调用。

    【讨论】:

    • 是的,我不打算让 void* 闲逛,为了简单起见,我只写了一个模板参数。谢谢,我以后会试试 -S g++ 标志。
    【解决方案2】:

    是的,任何现实世界的 C++ 编译器(即 gcc、cland、VC++)在开启优化时都不会输出空内联函数的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-08
      • 2022-06-30
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 2013-05-01
      相关资源
      最近更新 更多