针对非类型参数的特定值的模板代码优化
Template code optimization for specific values of non-type parameters.
template <bool flag>
class foo
{
public:
int bar()
{
if(flag)
{
// stuff
}
}
};
编译器编译此类时,会用true或false替换标志参数。然后我们有if(true((或if(false((。然后,if子句检查常量表达式,并将在编译时被删除。我能指望编译器的行为是这样的吗?
不,你不能。任何优化都完全取决于编译器。由于您使用的是模板,因此应该为flag
的两种情况编写专门化。
优化是特定于编译器的。为什么不创建发布版本并逐步进行反汇编?
尽管如此,这不是一种惯用的方式。您应该使用模板专用化或方法重载。它们都提供编译时解析。因此,在这种情况下,我更喜欢后者:
#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
}
};
EDIT:这需要C++0x,但通过包含boost/type_traits
并将std::
指令更改为boost::
,可以很容易地转换为C++98。当然,这将需要加强图书馆。
Expect,是的。Rely,没有。但是你怎么会注意到呢?
请注意,如果在if
语句中编写代码,则无法使用false
实例化模板。当flag
为false
时,该语句无法编译。删除测试将由优化器完成,优化器在概念上是在编译器首先弄清楚代码的含义后运行的。
相关文章:
- 扩展C++生成的代码的模板参数类型名称
- 有没有办法通过使用十进制 ASCII 代码自动类型扣除来获取字符?
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 具有可变参数非类型参数的模板专用化
- 函数类型参数的模板参数推导
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 为模板传递非类型参数 agument
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 如何避免具有相同类型参数的函数中的错误
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- c++非类型参数包扩展
- 即使我传递了无效的类型参数,我为什么还能在没有错误的情况下编译此代码
- 为什么传递值参数经常使编译器更容易进行代码优化
- 代码::块抱怨参数类型
- 如何优化代码中的参数
- 针对非类型参数的特定值的模板代码优化