2012-04-17 38 views
7

Có cách nào để đảm bảo thứ tự khởi tạo đối tượng tĩnh cho một số đối tượng nhất định cho toàn bộ chương trình hay không. Tôi có các bộ cấp phát bộ nhớ mà tôi muốn được phân bổ như những thứ đầu tiên trong một chương trình, vì chúng sẽ được sử dụng ở nơi khác trong suốt chương trình và tôi muốn sử dụng các bộ phân bổ này để phân bổ tất cả bộ nhớ sau này.Khởi tạo bộ nhớ cụ thể cho bộ biên dịch

Tôi hiểu đây có lẽ là trình biên dịch cụ thể vì tôi không tin tiêu chuẩn C++ cho phép điều này. Hai trình biên dịch tôi quan tâm đến việc này là gcc và trình biên dịch của VS2010. Nếu có cách nào đó, ai đó có thể giải thích như thế nào?

EDIT

Tôi không muốn "xây dựng trên sử dụng đầu tiên" vì allocators sẽ được phân bổ một khối lượng lớn các ký ức mà tôi muốn khởi tạo vào lúc bắt đầu của chương trình.

+1

Bạn có nghĩa là "để đảm bảo thứ tự khởi tạo đối tượng tĩnh" hoặc cái gì? – Griwes

+1

Tại sao một người nào đó bị downvote? – chadb

+5

Bạn có thể muốn viết lại câu hỏi của mình. Bởi vì nó không có ý nghĩa nhiều theo cách nó là – Grizzly

Trả lời

7

Bạn có thể ảnh hưởng một phần đến thứ tự khởi tạo bằng cách sử dụng chỉ thị cụ thể của trình biên dịch. MSVC có một pragma

#pragma init_seg({ compiler | lib | user | "section-name" [, func-name]}) 

mà phần nào có thể đặt ưu tiên cho một mô-đun cụ thể. Xem tham chiếu này cho init_seg.

Trình biên dịch gcc có cú pháp thuộc tính tương tự/liên quan để đặt mức ưu tiên tương đối của một khởi tạo cụ thể. Có vẻ như đây là

Some_Class A __attribute__ ((init_priority (2000))); 
Some_Class B __attribute__ ((init_priority (543))); 

và được giải thích trên trang này trên init_priority.

+1

Rất thú vị. Bạn có thể cung cấp một ví dụ về làm thế nào để làm Some_Class cho MSVC? – josephthomas

+1

@Bo Persson: Bạn có thể hiển thị ví dụ về Some_Class cho MSVC không? Sau khi đọc tài liệu tôi không thấy một cái gì đó tương tự như Some_Class A là có thể (mặc dù tôi tin rằng nó là có thể, đó là những gì tài liệu nói, tuy nhiên, tôi dường như không thể đạt được nó). – chadb

+0

Bạn không thể có được chính xác chức năng tương tự cho MSVC. Bạn có thể thêm '#pragma init_seg (lib)' vào tệp để khởi tạo đối tượng 'Some_Class' để làm cho nó được khởi tạo trước mã người dùng. Bạn không thể có được mức độ ưu tiên chính xác cho từng đối tượng riêng lẻ. –

0

Tôi đoán rằng bạn đang đề cập đến dấu phẩy thứ tự khởi tạo tĩnh, nhờ đó chương trình của bạn có cơ hội gọi hành vi chưa xác định khi biến tĩnh được khởi tạo dựa trên trạng thái của biến tĩnh khác (Có thể hoặc không đã có nhà xây dựng của nó được gọi là vào thời điểm đó).

Cách giải quyết cho vấn đề này là xây dựng trên đầu tiên sử dụng thành ngữ, được mô tả trong thư mục C++ FAQ ở đây:

http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.15

+0

Tôi nhìn vào điều này trước đây, tuy nhiên, tôi không muốn "xây dựng trên sử dụng đầu tiên" bởi vì các cấp phát sẽ phân bổ một khối lớn bộ nhớ mà tôi muốn khởi tạo ở đầu chương trình. – chadb

+1

@chadb: Có lẽ bạn nên mô tả chi tiết hơn những gì bạn đang làm. Bởi vì từ câu hỏi của bạn tôi sẽ giả sử xây dựng trên sử dụng đầu tiên là hoàn toàn tốt đẹp (lưu ý rằng sử dụng đầu tiên có thể được bên trong xây dựng một đối tượng tĩnh). – Grizzly

+0

Vì vậy, bạn sẽ có bộ kích hoạt phân bổ bộ nhớ của bạn bằng bộ khởi tạo đầu tiên để cố gắng sử dụng nó. – ams

0

Thay vì cố gắng để kiểm soát khởi tĩnh, mà sẽ chỉ làm cho bạn giờ hoặc nhiều thời gian gỡ lỗi vô lý hơn trong tương lai, phân bổ bộ nhớ của bạn vào lúc bắt đầu main. Sau đó, bạn vẫn nhận được bộ nhớ được phân bổ trước của bạn mà không có tất cả những cạm bẫy của init tĩnh.

+0

Đó là một chút trễ cho tất cả những bộ khởi tạo tĩnh chạy trước chính và dựa vào bộ nhớ được đề cập. – ams

+0

harvard arch. bộ vi xử lý có thể cần khởi tạo tĩnh để lưu trữ dữ liệu trên bộ nhớ chương trình, thường chỉ đọc bộ nhớ flash trên AVR uC. là bộ nhớ chỉ đọc mà bạn không thể phân bổ thời gian chạy hoặc khởi tạo. –

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