2014-11-05 25 views
9

Câu hỏi:
Tại sao đối tượng chưa được khởi tạo được xây dựng trong kiểu định nghĩa bên một cơ quan chức năng đã không xác định giá trị, trong khi đối tượng được xây dựng trong kiểu định nghĩa ngoài của bất kỳ chức năng được khởi tạo 0 hoặc ''?Tại sao các đối tượng chưa được khởi tạo của kiểu dựng sẵn được xác định bên trong một thân hàm có giá trị không xác định?

Hãy ví dụ này:

#include <iostream> 
using std::cout; using std::endl; 

int ia[10];     /* ia has global scope */ 

int main() 
{ 
    int ia2[10];    /* ia2 has block scope */ 

    for (const auto& i : ia) 
     cout << i << " ";  /* Result: 0 0 0 0 0 0 0 0 0 0 */ 

    cout << endl; 
    for (const auto& i : ia2) 
     cout << i << " ";  /* Result: 1972896424 2686716 1972303058 8 
           1972310414 1972310370 1076588592 0 0 0 */ 
    return 0; 
} 
+8

Hãy xem xét chi phí cho việc khởi tạo các hình cầu một lần so với khởi tạo người dân địa phương mỗi lần hàm được gọi. – Angew

+7

Đây rõ ràng là ** không trùng lặp ** (ít nhất không phải là câu hỏi được liên kết). OP không hỏi * nếu * bộ nhớ toàn cục được khởi tạo nhưng thay vì * tại sao *, và cũng là lý do tại sao các biến cục bộ là * không *, cả hai đều không được trả lời trong câu hỏi được liên kết. – leemes

Trả lời

16

Bởi vì một trong những quy tắc chung của C++ là bạn không trả tiền cho những gì bạn không sử dụng.

Khởi tạo đối tượng toàn cầu tương đối rẻ vì nó chỉ xảy ra một lần khi khởi động chương trình. Việc khởi tạo biến cục bộ sẽ thêm phí vào mọi cuộc gọi hàm, mà không phải mọi người đều muốn. Vì vậy, nó đã được quyết định để khởi tạo của người dân địa phương tùy chọn, giống như cách trong ngôn ngữ C.

BTW Nếu bạn muốn khởi tạo mảng của bạn bên trong một hàm, bạn có thể viết:

int ia2[10] = {0}; 

hoặc trong C++ 11:

int ia2[10]{}; 
+0

Bạn có thể muốn đề cập đến ngăn xếp (cách thực hiện chung bộ nhớ tự động) và cách rút lui bạn có thể để nó ở trạng thái ngẫu nhiên và khi bạn phát triển nó theo quy tắc trên, bạn không phải xóa nó. – Yakk

1

Vâng câu trả lời cho câu hỏi của bạn có thể được tìm thấy tại đây http://www.cplusplus.com/doc/tutorial/arrays/

Về cơ bản, nếu biến được xác định bên ngoài phạm vi thì mặc định là không được khởi tạo.

Mảng tĩnh và được khai báo trực tiếp trong không gian tên (bên ngoài mọi chức năng ), luôn được khởi tạo. Nếu không có bộ khởi tạo rõ ràng nào được chỉ định là , tất cả các phần tử được khởi tạo mặc định (với số không, cho loại cơ bản).

Điều này được so sánh với các biến được xác định bên trong phạm vi không được xác định 0.

Theo mặc định, các mảng thông thường của phạm vi địa phương (ví dụ: phạm vi được khai báo trong hàm) không được khởi tạo. Điều này có nghĩa là không có phần tử nào được đặt thành bất kỳ giá trị cụ thể nào; nội dung của chúng là chưa được xác định tại thời điểm mảng được khai báo.

Liên kết trên thực sự giải thích nó rất tốt và tôi không hề liên kết với chúng.

+0

Tôi xin lỗi vì sự hiểu lầm trong những gì bạn đang tìm kiếm. Hơn nữa đến điểm bên ngoài của một hàm, trong phạm vi toàn cục, C++ cho nó một thời gian lưu trữ tĩnh. Bên trong một hàm hoặc trong phạm vi cục bộ, nó có thời lượng lưu trữ tự động. http://en.cppreference.com/w/cpp/language/storage_duration – williamscodes

2

Biến được định nghĩa bên ngoài hàm nằm trong phạm vi toàn cục. Các biến toàn cục được lưu trữ trong phần BSS của phân đoạn dữ liệu của tệp thực thi. Được khởi tạo bằng không theo mặc định khi khởi động chương trình trực tiếp và chỉ thực hiện một lần.

Các biến được xác định trong chức năng mặt khác được lưu trữ trên ngăn xếp, khởi tạo nó bằng không mỗi lần sẽ là một hoạt động tương đối tốn kém.

Nhìn vào liên kết này cho Memory Layout của một chương trình: Memory Layout 1

Nhìn vào liên kết này cũng cho lời giải thích tốt: Memory Layout 2
Trích dẫn từ liên kết ở trên

toàn cầu, bên ngoài, và biến tĩnh được mặc định khởi tạo bằng không.

+0

Không hoàn toàn đúng. Các biến được khởi tạo với thời lượng tĩnh (ví dụ: 'int somedata = 42;') sẽ nằm trong phân đoạn .data và được khởi tạo tại thời gian biên dịch/liên kết vì phân đoạn .data được ánh xạ vào bộ nhớ. –

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