func考虑一个对性能非常关键的函数模板。它可以用T=Type1或其他类型实例化。部分功能逻辑依赖于T它的实例化。
可以显式使用if constexpr(代码 B)或使用 vanillaif代替(代码 A),而编译器可能会优化代码。
但是,我想知道,没有constexpr(代码 A)的实现有何不同?编译器是否不能在if实例化时检测在编译时使用(在代码 A 中)的哪个分支?它还能(对于代码 A)生成效率较低的代码吗?
代码 A.没有 if constexpr:
template<class T>
void func(T argument)
{
// some general type-independent logic
if (std::is_same<Type1,T>::value)
{
// do something
}
else
{
// do something else
}
// some general type-independent logic
}
代码 B.使用 if constexpr:
template<class T>
void func(T argument)
{
// some general type-independent logic
if constexpr (std::is_same<Type1,T>::value)
{
// do something
}
else
{
// do something else
}
// some general type-independent logic
}
代码 A 和 B 都可以编译,do something并且do something else对于任何T.
有一些类似的问题:
- 为什么
constexpr if需要?– 这一个在需要时回答constexpr。 if和之间constexpr if的区别——只列出区别
如果出于某种原因代码 B 比代码 A 更可取(当两个分支都格式良好时),上述问题无法回答。
我看到的唯一优点是明确告诉程序员这if是编译时;但是,我会说条件表达式是不言自明的。