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
是编译时;但是,我会说条件表达式是不言自明的。