c++ 11基于type_traits的条件块在编译后被消除
Is C++11 type_traits based condition block eliminated after compilation?
我试图理解c++ 11的type_traits。据我所知,它支持编译时类型确定。所以我想知道在以下情况下会发生什么:
假设我有一个简单的模板类:
template<class T>
class A {
public:
int num = 0;
A() {
if (is_integral<T>::value)
num = 5;
}
}
现在说我实例化A<int> a
a 100次,这是否意味着对于对象的每个构造,if块在构造函数中被调用?或者编译器在编译期间消除(优化掉)if块?一定要问我是否需要进一步澄清我的问题。
if
得到一个常数值。模板实例化后,变为if ( false )
。n = 5
的指令是否从应用程序二进制文件中省略是由实现定义的。当然,通过启用任何优化,死代码将被消除,但允许编译器将其留在那里,用于调试或偷懒。
调用if ( false )
意味着什么都不做,所以是的,什么都不确定会发生。优化通常不会改变程序的行为。这也是一个安全的赌注,它将发生在零周期。编译器不会将0加载到寄存器中,然后测试它,甚至可能在调试模式下也不会,因为这将是相当人为的。
或者编译器消除(优化掉)if块编译?
是的,is_integral
是模板类,value
是该类的公共静态成员常量。编译器可以(并且会,至少如果你打开了优化)很容易地消除使用常量的if语句。
相关文章:
- 访问条件类成员的方法不仅在被调用时才编译
- 如何使用 soong 命名空间来有条件地编译模块
- 如何摆脱为条件编译定义预处理器宏的需要?
- C++中的条件运算符 ( ? : ) 可以编译时吗?
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 编译时条件包含.分段标头与包括整个实现
- 如何在Visual Studio 2019中有条件地编译c++源文件
- 基于宏中传递的字符串的条件编译
- 如果条件取决于模板类型并且在编译时已知,是否可以保证C++编译器不会生成分支?
- 从语言设计层面来看,当编译时无法推断条件时,为什么"if constexpr"不衰减到"trival if"
- C++代码在 for 循环的条件下给出运行时错误,而如果它被具有相同意义的代码替换,则编译正确
- Eclipse CDT 条件编译?
- 用于根据条件选择编译时类型的可变参数模板
- 除了使用 #define 进行条件编译之外,还有其他选择吗?
- 如何编译模板类型名的时条件
- 为什么有条件编译运算符模板会更改另一个运算符的可用性?
- C 模板:如何根据数据类型有条件编译不同的代码
- 是否可以在编译时评估使用 std::is_same<> 的此条件?
- 根据编译时条件在类型之间选择类型的惯用方法
- 如果constexpr(条件)为编译时条件