2014-10-05 52 views
7

與C或C++相比,D的好奇之處在於,當未提供賦值時,變量將根據其類型進行默認初始化。是否忽略了多餘的默認初始化?

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

相比於C和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. 如果以上都不是,是否有一個很好的解決方案 有一個完全未初始化的變量?

回答

7
  1. 在可以確定的是一個變量將在未來被定義之前沒有讀取,將默認的初始化仍然發生的情況下,根據標準?

由於d不具有值型構造(默認struct構造函數),初始化不應該有任何副作用,因此編譯器被允許優化它扔掉。我相信這是消除死角的一個子集。

  • 它是否從DMD/GDC編譯器已知他們優化出(如在,省略缺省初始化時決不會從可變讀取默認值)?
  • 語言規範沒有規定在什麼優化的實現必須進行約束。上面的例子是不平凡的,所以我不會感到驚訝,例如, DMD不會優化它,或者GDC將達到最大優化級別。

  • 如果上述的,有一個很好的變通到具有完全未初始化的變量?
  • 是:int r = void;