是否省略了冗余默认初始化?

时间:2014-10-05 15:35:41

标签: initialization d

与C或C ++相比,D的一个奇怪方面是,当未提供赋值时,变量默认根据其类型进行初始化。

int foo() {
    int o; // int.init == 0
    o++;
    return o; // returns 1
}

与C和C ++相比,D和C ++只是将变量留给了潜在的垃圾,D确保从几乎所有类型的变量中都不会读取垃圾。但是,考虑到这个简单的,仅仅是假设的函数,r在设置为i之前永远不会被读取,并且可以肯定最终会发生赋值。

int foo2(int n) {
    assert(n > 0 && n < 20);
    int r;
    for (int i = n ; ; i+=7) {
        if (i % 3 == 0) {
            r = i;
            break;
        }
    }
    return r;
}
  1. 在确定将在中定义变量的情况下 将来没有先前的读取,将默认初始化 仍然会发生,根据标准?
  2. 是否可以从DMD / GDC编译器中了解它们(如同,省略默认值) 从未从中读取默认值时的初始化 变量)?
  3. 如果以上都没有,那么是否有一个很好的解决办法 有一个完全未初始化的变量?

1 个答案:

答案 0 :(得分:7)

  
      
  1. 在确定将来没有先前读取的情况下定义变量的情况下,根据标准,默认初始化是否仍会发生?
  2.   

由于D没有值类型构造函数(默认struct构造函数),初始化不应该有任何副作用,因此允许编译器优化它。我相信这是死亡任务消除的一个子集。

  
      
  1. 是否可以从DMD / GDC编译器中了解它们(例如,在从未从变量中读取默认值时省略默认初始化)?
  2.   

语言规范并未对实现必须执行的优化施加约束。上面的例子是非平凡的,所以我不会感到惊讶,例如DMD不会对其进行优化,或者GDC是否会达到最大优化级别。

  
      
  1. 如果没有上述内容,是否有一个很好的解决方案来拥有一个完全未初始化的变量?
  2.   

是:int r = void;