如何解决针对非类型参数的特定值的模板代码优化
|template <bool flag>
class foo
{
public:
int bar()
{
if(flag)
{
// stuff
}
}
};
编译器编译此类时,它将flag参数替换为true或false。然后我们有if(true)(或if(false))。然后,if子句将检查常量表达式,并在编译时将其删除。我可以期望编译器具有这种行为吗?
解决方法
优化是特定于编译器的。为什么不创建发布版本并逐步拆卸?
尽管如此,这不是惯用的方法。您应该使用模板专门化或方法重载。它们都提供编译时解析。因此,在这种情况下,我希望后者:
#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。而且,当然,这将需要增强库。
, 不,你不能。任何优化完全取决于编译器。由于您使用的是模板,因此对于两种情况flag
,您都应编写专门的名称。
, 期待,是的。真的不行但是你怎么会注意到呢?
请注意,如果您在if
语句中编写代码,而当flag
为false
时编译失败,则无法使用false
实例化模板。删除测试将由优化器完成,该优化器在概念上是在编译器首先确定代码含义之后运行的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。