Trong cột Guru Of The Week #28, Herb Sutter sử dụng một liên minh nhưng nó ít mạnh mẽ hơn nỗ lực của Boost.
Boost's aligned_storage giải quyết các chi tiết đẫm máu cho bạn. Nếu bạn nhìn vào triển khai của nó, bạn sẽ thấy nó sử dụng __alignof
của MSCV hoặc __alignof__
của GCC cũng như một mẫu khác: type_with_alignment
.
Từ codebase của riêng tôi, Tôi đã từng sử dụng (có nguồn gốc từ liên kết GOTW trên):
#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 150020706)
# pragma warning(push)
# pragma warning(disable: 4371)
#endif // #if (defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 150020706)
union AlignedStorage
{
char storage[sizeof(T)];
int16 dummy0;
int32 dummy1;
int64 dummy2;
float dummy3;
double dummy4;
long double dummy5;
void (*dummy6)();
struct dummy7;
int dummy7::*dummy8;
#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140050215)
# pragma warning(push)
# pragma warning(disable: 4121)
#endif // #if (defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140050215)
int (dummy7::*dummy9)(int);
#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140050215)
# pragma warning(pop)
#endif // #if (defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140050215)
}; // AlignedStorage
#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 150020706)
# pragma warning(pop)
#endif // #if (defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 150020706)
Những ngày này tôi sẽ chỉ dựa vào Boost vì nó có khả năng bao trùm nhiều hơn nữa các trường hợp góc và độ đặc hiệu trình biên dịch
Nguồn
2013-08-19 21:36:12
Câu hỏi thú vị. 1 để ghi nhớ để tự hit các destructor (mặc dù tôi là một chút mất mát như thế nào bạn đang làm như vậy thông qua một 'const'. Tôi thực sự cần phải chải lên trên' const' vị trí của tôi). – WhozCraig
@WhozCraig: Cảm ơn. Lưu ý rằng pointee không phải là const, con trỏ chính nó là. :) – Mehrdad
Vâng, tôi chỉ thấy điều đó. = P –
WhozCraig