2010-12-29 46 views
5

Tôi đã cố gắng để có được đầu của tôi xung quanh việc bổ sung TR1 được gọi là aligned_storage. Trong khi đọc các tài liệu sau đây N2165, N3190N2140 Tôi không thể cho cuộc sống của tôi nhìn thấy một tuyên bố mà nó mô tả rõ ràng ngăn xếp hoặc đống bản chất của bộ nhớ đang được sử dụng.Mục tiêu phân bổ của tiêu chuẩn :: aligned_storage (stack hoặc đống?)

Tôi đã xem xét triển khai được cung cấp bởi msvc2010, tăng và gcc tất cả đều cung cấp giải pháp dựa trên ngăn xếp tập trung xung quanh việc sử dụng liên minh.

Nói tóm lại:

  • là loại bộ nhớ (chồng hoặc đống) được sử dụng bởi aligned_storage thực hiện xác định hoặc là nó luôn luôn có nghĩa là để được ngăn xếp dựa?

  • và, Tài liệu cụ thể xác định/xác định điều đó là gì?

Lưu ý: Trong MSVC10, sau đây là định nghĩa của các loại aligned_storage, trong trường hợp này nếu aligned_storage là một biến tự động dữ liệu (_Val, _Pad) được tạo ra trên stack:

template<class _Ty, size_t _Len> 
union _Align_type 
{ 
    // union with size _Len bytes and alignment of _Ty 
    _Ty _Val; 
    char _Pad[_Len]; 
}; 

Lưu ý: Đây là NOT một câu hỏi nhỏ. Hãy thử và hiểu câu hỏi trước khi đăng câu trả lời.

Trả lời

12

std::aligned_storage<Len, Align> chỉ khai báo thành viên typedef (type).

Thành viên typedef type phải một loại POD phù hợp để sử dụng như lưu trữ chưa được khởi tạo cho bất kỳ đối tượng có kích thước tối đa là Len và có sự liên kết là một ước của Align

(Đây là từ mới nhất C++ 0x draft, N3225, 20.7.6.6 Bảng 53, nhưng ngôn ngữ trong đặc tả TR1, N1836, có hiệu quả giống nhau ngoại trừ trong C++ 0x tham số mẫu Align là đối số mặc định của nó, giá trị căn chỉnh tối đa.)

std::aligned_storage không phân bổ bất kỳ bộ nhớ nào. Bạn có thể tạo đối tượng thuộc loại std::aligned_storage<Len, Align>::type và diễn giải lại đối tượng đó dưới dạng đối tượng thuộc bất kỳ loại nào đáp ứng các yêu cầu đã nêu ở trên.

+2

Tôi không chắc câu trả lời có thể cải thiện hơn điều này không. Điều gì sẽ là điểm nếu dữ liệu được phân bổ động trong 'loại'? Làm thế nào mà có thể có thể được giúp đỡ về sự liên kết? – icecrime

+2

@Zenikoder - chỉ đọc báo giá từ Standard một lần nữa. Và một lần nữa, nếu cần thiết. :) 'std :: aligned_storage <...> :: type' xác định loại POD có căn chỉnh được yêu cầu. Bạn có thể cấp phát bộ nhớ cho loại này trên ngăn xếp hoặc trong heap, nó không có liên quan. – atzz

+0

@Zenikoder - nó không được thực hiện xác định. Nó do người dùng định nghĩa. Tuyên bố được trích dẫn bởi James giải thích mọi thứ đủ rõ ràng. – atzz

0

Bạn thường không cần phải căn chỉnh nội dung trên đống vì bất kỳ phân bổ nào (new/malloc) trả về bộ nhớ tại địa chỉ được liên kết với bất kỳ loại nào.

+3

Điều này không đúng. Nếu bạn sử dụng lệnh SIMD, đôi khi bạn cần phải có dữ liệu liên kết 16 byte ranh giới, trong khi new/malloc không cung cấp bảo hành như vậy. Đối với exemple, libc malloc trở lại bộ nhớ liên kết trên 8 byte ranh giới. Xem các hàm 'posix_memalign' trên Linux hoặc' _aligned_malloc' trên Windows. –

+1

Tôi chỉ có thể phân bổ bộ nhớ liên kết trên heap bằng cách sử dụng std :: align, chưa có trong gcc4.8, vì vậy tôi sử dụng triển khai này: http://code.google.com/p/c-plus/source /browse/src/util.h#57 –

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