C ++会优化空/非虚/空方法调用吗?

时间:2014-03-16 16:38:00

标签: c++ templates optimization

示例代码:

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 ++书中所述)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

假设启用了内联(所以“打开了一些优化”),那么是的,任何体面的编译器都应该将这种事情变成零指令。特别是在模板中,因为模板需要[在几乎所有当前编译器中,至少]编译器“看到”对象的源。在非模板化的情境中,可能会出现一种情况,即你“脱节”声明空lock代码,并且编译器无法知道该函数是空的。

(在void *smth tho中append看起来很可怕 - 我希望你的意图是将其作为真实实现中的第二个模板类型)

就像“编译器是否执行此操作”一样,如果它非常重要,则需要检查您的编译器是否在此特定情况下执行了您所期望的操作。例如,clang++ -Sg++ -S会显示您的append功能中是否有来电。