template <bool flag>
class foo
{
public:
int bar()
{
if(flag)
{
// stuff
}
}
};
当编译器编译此类时,它会将flag参数替换为true或false。然后我们有if(true)(或者if(false))。然后,if子句检查常量表达式并在编译时将被删除。我能指望编译器表现得像这样吗?
答案 0 :(得分:6)
不,你不能。任何优化都完全取决于编译器。由于您使用的是模板,因此您应该为flag
。
答案 1 :(得分:2)
优化是特定于编译器的。为什么不创建发布版本并逐步进行反汇编?
尽管如此,这并不是惯用的方式。您应该使用模板专门化或方法重载。它们都提供编译时解析。所以,在这种情况下,我更喜欢后者:
#include <type_traits>
template <bool flag>
class foo
{
public:
int bar()
{
_bar(std::integral_constant<bool, flag>())
}
private:
int _bar(std::true_type)
{
// stuff
}
int _bar(std::false_type)
{
// empty
}
};
编辑:这需要C ++ 0x,但可以通过包含boost/type_traits
并将std::
指令更改为boost::
来轻松转换为C ++ 98。当然,它需要增强库。
答案 2 :(得分:2)
期待,是的。依旧,没有。但是你怎么会注意到呢?
请注意,如果在false
语句中编写的代码在if
为flag
时无法编译,则无法使用false
实例化模板。删除测试将由优化器完成,优化器在编译器首先找出代码的含义后概念性地运行。