2014-10-05 18 views
7

Một trong những khía cạnh tò mò của D khi so sánh với C hoặc C++ là các biến được khởi tạo mặc định theo loại của chúng khi giá trị gán không được cung cấp.Các khởi tạo mặc định dư thừa có bị bỏ qua không?

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

Ngược lại với C và C++, chỉ đơn giản là để lại biến với rác tiềm năng, D đảm bảo rằng rác không bao giờ được đọc từ gần như tất cả các loại biến. Tuy nhiên, xem xét chức năng đơn giản này, chỉ là giả thiết, r không bao giờ được đọc trước khi được đặt thành i và chắc chắn rằng nhiệm vụ sẽ xảy ra sau cùng.

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. Trong một trường hợp chắc chắn rằng một biến sẽ được xác định trong tương lai mà không đọc trước, sẽ khởi tạo mặc định vẫn xảy ra, theo tiêu chuẩn?
  2. Được biết từ trình biên dịch DMD/GDC để tối ưu hóa chúng (như trong, bỏ mặc định khởi tạo khi giá trị mặc định đó không bao giờ đọc từ biến số )?
  3. Nếu không có điều nào ở trên, có một công việc tốt đẹp xung quanh để có biến hoàn toàn chưa được khởi tạo không?

Trả lời

7
  1. Trong một trường hợp chắc chắn rằng một biến sẽ được xác định trong tương lai mà không cần đọc trước, sẽ khởi tạo mặc định vẫn xảy ra, theo tiêu chuẩn?

Kể từ D không có nhà thầu giá trị-type (mặc định struct constructors), khởi tạo không nên có bất kỳ tác dụng phụ, do đó trình biên dịch được phép tối ưu hóa nó đi. Tôi tin rằng đây là một tập con của việc loại bỏ bài tập chết.

  1. Is it biết đến từ các trình biên dịch DMD/GDC để tối ưu hóa chúng ra (như trong, bỏ qua khởi tạo mặc định khi mà giá trị mặc định là không bao giờ đọc từ biến)?

đặc điểm kỹ thuật Ngôn ngữ không áp đặt một hạn chế về những gì tối ưu hóa một thực hiện phải thực hiện. Ví dụ trên là không tầm thường, vì vậy tôi sẽ không ngạc nhiên nếu ví dụ: DMD sẽ không tối ưu hóa nó đi, hoặc nếu GDC sẽ ở mức tối ưu hóa tối đa.

  1. Nếu không có điều nào ở trên, có công việc tốt đẹp để có biến hoàn toàn chưa được khởi tạo không?

Có: int r = void;

Các vấn đề liên quan