1

我试图理解 C++11 的 type_traits。据我了解,它可以在编译时确定类型。所以我想知道在以下情况下会发生什么:

假设我有一个简单的模板类:

template<class T>
class A {
    public:
        int num = 0;
        A() {
           if (is_integral<T>::value)
                num = 5;
        }
}

现在说我实例化A<int> a了 100 次,这是否意味着对于对象的每个构造,在构造函数中都会调用 if 块?还是编译器在编译期间消除(优化)if块?请问我是否应该进一步澄清我的问题。

4

2 回答 2

1

还是编译器在编译期间消除(优化)if块?

是的,is_integral是一个模板类,并且value是该类的公共静态成员常量。编译器可以(并且将,至少如果您打开优化)轻松消除使用常量的 if 语句。

http://en.cppreference.com/w/cpp/types/is_integral

于 2013-05-26T06:43:14.970 回答
1

if得到一个常数值。模板实例化后,变为if ( false ). 是否从应用程序二进制文件中省略指令n = 5是实现定义的。当然,启用任何优化后,死代码都将被消除,但编译器可以将其留在那里,以进行调试或通过懒惰。

调用if ( false )意味着什么都不做,所以是的,什么都不会发生。优化通常不会改变程序的行为。这也是一个安全的赌注,它会在零周期内发生。即使在调试模式下,编译器也不会将零加载到寄存器中然后对其进行测试,因为那将是相当人为的。

于 2013-05-26T06:48:12.760 回答