c++ 11基于type_traits的条件块在编译后被消除

Is C++11 type_traits based condition block eliminated after compilation?

本文关键字:编译 条件 基于 type traits c++      更新时间:2023-10-16

我试图理解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语句。

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