2010-01-19 36 views

Trả lời

62
  1. an: rời khỏi bộ nhớ một mình sẽ bị rò rỉ thông tin từ các quá trình khác hoặc hạt nhân.

  2. Hiệu quả: các giá trị là vô dụng cho đến khi khởi tạo một cái gì đó, và nó hiệu quả hơn để zero chúng trong một khối với vòng unrolled. Hệ điều hành thậm chí có thể không phải là trang tự do khi hệ thống không hoạt động, thay vì khi một số khách hàng hoặc người dùng đang chờ chương trình bắt đầu.

  3. lặp: để lại những giá trị mình sẽ làm cho hành vi chương trình không lặp lại, làm cho lỗi thực sự khó tìm.

  4. Elegance: nó sạch hơn nếu chương trình có thể bắt đầu từ 0 mà không cần phải lộn xộn mã với initializers mặc định. sau đó

người ta có thể tự hỏi tại sao lớp auto lưu trữ không bắt đầu như rác. Câu trả lời là hai lần:

  1. Nó không, theo nghĩa nào đó. Trang khung ngăn xếp đầu tiên ở mỗi cấp (nghĩa là, mỗi trang mới được thêm vào ngăn xếp) không nhận được giá trị bằng không. Giá trị "rác" hoặc "chưa được khởi tạo" mà các phiên bản chức năng tiếp theo ở cùng một mức ngăn xếp xem thực sự là các giá trị trước đó còn lại bởi các thể hiện phương thức khác của chương trình của riêng bạn và thư viện của nó.

  2. Có thể có một bậc hai (hoặc bất kỳ) runtime hiệu suất phạt gắn liền với khởi auto (chức năng địa phương) để bất cứ điều gì. Một hàm có thể không sử dụng bất kỳ hoặc tất cả một mảng lớn, ví dụ, trên bất kỳ cuộc gọi nào, và nó có thể được gọi hàng ngàn hoặc hàng triệu lần. Việc khởi tạo các thống kê và hình cầu, OTOH, chỉ cần xảy ra một lần.

+2

Tôi đoán Asker muốn biết tại sao 'int tĩnh x; 'luôn luôn làm cho' x' khởi tạo không khi' int x; '' x' lá là rác. – kennytm

+0

Hmm, bạn có thể đúng, tôi đã sửa đổi câu trả lời để giải quyết vấn đề đó. – DigitalRoss

+3

Trên thực tế lý do thực sự là tiêu chuẩn C ban đầu là để hệ thống hóa thực hành hiện có hơn là giới thiệu nội dung mới. Và pre-ANSI/ISO C đã làm nó cho hiệu quả. – paxdiablo

22

Bởi vì với sự hợp tác thích hợp của hệ điều hành, 0 khởi tạo thống kê và hình cầu có thể được triển khai mà không phải trả phí thời gian chạy.

+0

và các biến tĩnh và toàn cục được khởi tạo trước khi thực thi mã của chúng tôi và do đó nhiều hoặc ít hơn trách nhiệm của mainCRTStartup() để khởi tạo nó .. –

6

Hãy suy nghĩ về điều đó, trong lĩnh vực tĩnh bạn không thể nói luôn luôn chắc chắn rằng một cái gì đó thực sự được khởi tạo, hoặc chính đã bắt đầu. Ngoài ra còn có một init tĩnh và một giai đoạn init động, một cái tĩnh đầu tiên ngay sau cái động mà trật tự quan trọng.

Nếu bạn không có số không thống kê thì bạn hoàn toàn không thể nói trong giai đoạn này để chắc chắn nếu có bất cứ thứ gì được khởi tạo TẤT CẢ và ngắn gọn thế giới C++ sẽ bay ra xa và những thứ cơ bản như singletons (hoặc bất kỳ loại init tĩnh động) sẽ đơn giản ngừng hoạt động.

Câu trả lời với các điểm đánh dấu là nhiệt tình nhưng hơi ngớ ngẩn. Tất cả đều có thể áp dụng cho phân bổ không tĩnh nhưng điều đó không được thực hiện (tốt, đôi khi nhưng không thường).

+0

Điểm độc đáo lúc đầu nghe có vẻ hấp dẫn, nhưng tôi không chắc nó có liên quan gì không : Các trình biên dịch lưu trữ các cờ y/n 'đã được tạo ra của chúng' là một chi tiết thực hiện, và chúng chắc chắn sẽ chỉ miễn phí cho zero _those_ trước khi khởi động. Phần còn lại là quá flippant mà không thực sự giải thích chính nó. Ngoài ra: 'cái tĩnh đầu tiên ngay sau cái động. là cái tĩnh đầu tiên? hoặc là nó 'ngay sau khi một năng động? và sự khác biệt là gì? Ngoài ra, thứ tự khai báo quan trọng trong mọi trường hợp mà các đối tượng phụ thuộc vào nhau, bất kể thời gian lưu trữ, phải không? –

15

Mục 6.7.8 Khởi tạo theo tiêu chuẩn C99 (n1256) trả lời câu hỏi này:

Nếu một đối tượng có thời gian lưu trữ tự động không được khởi tạo một cách rõ ràng, giá trị của nó là không xác định. Nếu đối tượng có thời lượng lưu trữ tĩnh không được khởi tạo rõ ràng, thì:

- nếu đối tượng có loại con trỏ, nó được khởi tạo thành con trỏ rỗng;

- nếu nó có loại số học, nó được khởi tạo thành số không (dương hoặc không dấu);

- nếu đó là tổng hợp, mọi thành viên được khởi tạo (đệ quy) theo các quy tắc này;

- nếu đó là công đoàn, thành viên được đặt tên đầu tiên được khởi tạo (đệ quy) theo các quy tắc này.

+4

Không trả lời câu hỏi của OP. Anh ấy biết tất cả điều này. Anh ta hỏi * tại sao. * -1 – EJP

+3

Có, nếu "C/C++" trong câu hỏi có nghĩa là tiêu chuẩn C/C++, câu trả lời của tôi là không liên quan. Nếu không, nó có liên quan. –

2

Trong C, các đối tượng được phân bổ tĩnh không có bộ khởi tạo rõ ràng được khởi tạo bằng không (đối với loại số học) hoặc con trỏ rỗng (đối với loại con trỏ). Việc triển khai C thường biểu diễn các giá trị bằng 0 và các giá trị con trỏ null bằng cách sử dụng một mẫu bit chỉ bao gồm các bit có giá trị bằng không (mặc dù điều này không được yêu cầu bởi tiêu chuẩn C). Do đó, phần bss thường bao gồm tất cả các biến chưa được khởi tạo khai báo ở phạm vi tệp (tức là, bên ngoài của bất kỳ hàm nào) cũng như các biến cục bộ chưa được khởi tạo được khai báo với từ khóa tĩnh.

Nguồn: Wikipedia

+0

Câu hỏi đặt ra là tại sao điều này xảy ra. Chỉ cần dán một câu trích dẫn lặp lại những gì xảy ra không phải là câu trả lời cho điều đó. –

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