c++ - 编译后是否消除了基于 C++11 type_traits 的条件 block ?

标签 c++ c++11

我正在尝试理解 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/

相关文章:

c++ - 使用 new 和传递指针时的基本 C++ 段错误

c++ - 多个 vector 的数据表示

c++ - C++ 中的 std::memory_order 究竟提供了哪些栅栏?

c++ - 如何强制用户/操作系统输入 Ascii 字符串

c++ - 为什么私有(private)成员变量上不允许使用 decltype?

c++ - Bool 在 `std::rel_ops` 示例中强制转换?

android - 将一个圆圈分成不同的区域作为飞镖盘?

c++ - 使用 C++ 的视频流

mysql - CodeBlocks c++ 使用 SQLAPI++ 连接到 MySQL 时出错

c++ - 使用 lambda 函数模拟词法闭包是否存在不可预见的性能/实现问题?