我正在尝试理解 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 block ?还是编译器在编译期间消除(优化掉)if block ?请问我是否应该进一步澄清我的问题。
最佳答案
if
得到一个常量值。模板实例化后,变为if (false)
。 n = 5
的指令是否从应用程序二进制文件中省略是实现定义的。当然,启用任何优化后,死代码将被消除,但允许编译器将其留在那里,用于调试或懒惰。
调用 if ( false )
意味着什么都不做,所以是的,什么都不会发生。优化通常不会改变程序的行为。这也是一个安全的赌注,它会在零周期中发生。编译器不会将零加载到寄存器中然后对其进行测试,甚至可能在 Debug模式下也是如此,因为那将是相当人为的。
关于c++ - 编译后是否消除了基于 C++11 type_traits 的条件 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16756779/