2014-10-05 5 views
7

Jednym z ciekawszych aspektów D w porównaniu z C lub C++ jest to, że zmienne są domyślnie inicjowane zgodnie z ich typem, gdy nie podano wartości przypisania.Czy pominięto redundantne domyślne inicjacje?

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

W przeciwieństwie do C i C++, które po prostu pozostawia zmienne z potencjalnymi śmieciami, D zapewnia, że ​​śmieci nigdy nie są czytane z prawie wszystkich typów zmiennych. Jednak biorąc pod uwagę tę prostą, tylko hipotetyczną funkcję, r nigdy nie jest czytany przed ustawieniem na i i jest pewne, że zadanie to zostanie ostatecznie zrealizowane.

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. W przypadku, gdy jest pewne, że zmienna zostanie określony w przyszłości bez poprzedniego odczytu, będzie domyślnym inicjalizacji jeszcze zdarzyć, zgodnie z normą?
  2. Czy z kompilatorów DMD/GDC jest znana optymalizacja (jak w przypadku pominięcia domyślnej inicjalizacji , gdy ta domyślna wartość nigdy nie jest odczytywana ze zmiennej )?
  3. Jeśli żadna z powyższych opcji, nie ma niezłej pracy do o całkowicie niezainicjowanej zmiennej?

Odpowiedz

7
  1. W przypadku, gdy jest pewne, że zmienna zostanie określony w przyszłości bez poprzedniego odczytu, będzie domyślnym inicjalizacji jeszcze zdarzyć, zgodnie z normą?

Od D nie mają konstruktorów wartości (domyślne struct konstruktorzy), inicjalizacji nie powinno mieć żadnych skutków ubocznych, więc kompilatory mogą zoptymalizować go z dala. Uważam, że jest to podzbiór eliminacji martwych zadań.

  1. Wiadomo od kompilatorów DMD/GDC, aby zoptymalizować je (jak w, pomijając domyślny inicjalizacji kiedy to wartość domyślna nie jest odczytywana ze zmiennej)?

specyfikacja Językiem nie nakłada ograniczenia na to, co optymalizacje implementację musi wykonania. Powyższy przykład jest nietrywialny, więc nie zdziwiłbym się, gdyby np. DMD nie zoptymalizuje go lub jeśli GDC osiągnie maksymalny poziom optymalizacji.

  1. Jeśli żadna z powyższych, jest tam ładne obejście do posiadania całkowicie niezainicjowanej zmiennej?

Tak: int r = void;

Powiązane problemy