2010-06-14 78 views
5

Tôi muốn biết, trong c + +, khi nào việc khởi tạo các đối tượng diễn ra?
Có phải lúc biên dịch hoặc thời gian liên kết không?
Đối với ví dụ:khởi tạo các đối tượng trong C++

//file1.cpp 
extern int i; 
int j=5; 

//file2.cpp (link with file1.cpp) 
extern j; 
int i=10; 

Bây giờ, những gì hiện biên dịch làm: theo tôi, nó phân bổ lưu trữ cho các biến.
Bây giờ tôi muốn biết:
hiện nó cũng đặt giá trị khởi tạo trong bộ nhớ đó hoặc được thực hiện tại thời gian liên kết?

Trả lời

2

Trên thực tế có những trường hợp khác nhau:

  • biến toàn cục hay biến tĩnh (không phải lớp): các giá trị này được lưu trữ trong phần init của tệp exe/dll. Các giá trị này được tạo bởi trình liên kết dựa trên thông tin tệp đối tượng được biên dịch. (khởi tạo khi tải + ánh xạ dll/exe vào bộ nhớ)
  • biến không tĩnh cục bộ: các giá trị này được đặt bởi trình biên dịch bằng cách đặt các giá trị này vào ngăn xếp (đẩy/bật trên x86) (khởi tạo trình biên dịch)
  • đối tượng : bộ nhớ được đặt trước trên ngăn xếp, cài đặt thực tế của giá trị được hoãn lại cho cuộc gọi đến hàm khởi tạo (khởi tạo thời gian chạy)
  • con trỏ tới đối tượng (không thực sự là trường hợp mới): khoảng trống được dành riêng cho con trỏ. Các đối tượng chỉ để tồn tại sau khi một cuộc gọi đến mới mà dự trữ bộ nhớ và gọi các nhà xây dựng để khởi tạo nó (chạy thời gian khởi tạo)
+0

Còn các thành viên "const tĩnh" (không phải lớp học) thì sao? Chúng thực sự tồn tại như một 'biến'? Tôi nghĩ rằng mọi cách sử dụng chúng chỉ đơn giản được thay thế bằng giá trị và biến "const tĩnh" biến mất. Đúng? Đối với phần còn lại, tổng quan tốt, +1. – Patrick

+0

Ok..Vì vậy, ở trên mã..vì những điều sau đây có xảy ra không? 1. trong khi biên dịch file1.cpp, trình biên dịch để lại i vì nó không phân bổ lưu trữ cho i. 2. trình biên dịch phân bổ lưu trữ cho j, nhưng không khởi tạo nó. 3. Trong khi biên dịch file2.cpp, trình biên dịch rời khỏi j vì nó là i.e không phân bổ dung lượng lưu trữ cho nó. 4. trình biên dịch phân bổ lưu trữ cho i, nhưng không khởi tạo nó. 5. Trong khi liên kết file1.o và file2.o, bây giờ hãy để file2.o được khởi tạo trước, vì vậy bây giờ: Liệu j có giá trị ban đầu là 0 không? hoặc không được khởi tạo? –

+0

@ Patrick, điểm tốt, tôi không biết chắc chắn. Tôi đoán bạn là đúng, vì chi phí có một biến cao hơn giá trị nội tuyến cho các loại cơ bản. Tuy nhiên không chắc chắn 100% nếu tất cả các trình biên dịch hoạt động theo cách đó ... – jdehaan

0

Như bạn đã nói trình biên dịch phân bổ lưu trữ cho các biến. Tôi nghĩ rằng giá trị intialization cũng sẽ được thực hiện tại thời gian biên dịch và không phải trong thời gian liên kết.

+0

Nhưng tôi đọc trong một cuốn sách mà trình biên dịch không thể xác định những gì sẽ là giá trị trong một lưu trữ, đó là lý do tại sao chúng tôi không thể sử dụng một cái gì đó như thế này: int a = 5; int arr [a]; –

+0

@Happy Nếu trình biên dịch đã phân tích đủ để nhận ra rằng có thể được chuyển thành 'int arr [5];' nó sẽ ổn, nhưng nói chung thì không (nó thậm chí có thể không được cho phép bởi spec) –

+0

lý do cho int a = 5; int arr [a]; không được xác định là do kích thước mảng không xác định. Sau đó bạn có thể thay đổi một đến 10 thời gian đó làm thế nào để bạn nghĩ rằng trình biên dịch sẽ resizze kích thước khai báo trước đó. – ckv

0

Không có đối tượng nào trong ví dụ của bạn, chỉ int s. Nếu bằng cách "khởi tạo", bạn có nghĩa là khi nào giá trị của chúng được chỉ định, những số int s sẽ được chuyển đổi thành các mục có kích thước từ trong phần dữ liệu trong tệp đối tượng, sẽ được mã hóa cứng với giá trị ban đầu của chúng. Phần dữ liệu, cùng với phần còn lại của tập tin đối tượng, được tạo ra bởi trình biên dịch, vì vậy tôi cho rằng câu trả lời cho câu hỏi của bạn là thời gian biên dịch

+0

nếu bạn xem xét OOP thì chúng tôi có thể nói int cũng như một lớp học. – ckv

+0

@vis Ints không phải là các lớp trong C++, chúng là một kiểu nguyên thủy; không có lời gọi hàm tạo nào hoặc bất kỳ giàn giáo nào khác liên kết với các lớp học –

+0

Thats đúng. Tôi hiểu. có lẽ chúng ta phải thay đổi câu hỏi thành Khởi tạo biến thay vì đối tượng. – ckv

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