示例代码:
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 ++书中所述)
答案 0 :(得分:1)
是的,任何真实的C ++编译器(即gcc,cland,VC ++)在打开优化时都不会输出空内联函数的代码。
答案 1 :(得分:1)
假设启用了内联(所以“打开了一些优化”),那么是的,任何体面的编译器都应该将这种事情变成零指令。特别是在模板中,因为模板需要[在几乎所有当前编译器中,至少]编译器“看到”对象的源。在非模板化的情境中,可能会出现一种情况,即你“脱节”声明空lock
代码,并且编译器无法知道该函数是空的。
(在void *smth
tho中append
看起来很可怕 - 我希望你的意图是将其作为真实实现中的第二个模板类型)
就像“编译器是否执行此操作”一样,如果它非常重要,则需要检查您的编译器是否在此特定情况下执行了您所期望的操作。例如,clang++ -S
或g++ -S
会显示您的append
功能中是否有来电。