在他的Guru Of The Week #28专栏中,Herb Sutter 使用了一个联合,但它不如 Boost 的努力强大。
Boost 的aligned_storage为您解决了血淋淋的细节。如果您查看它的实现,您会发现它使用 MSCV__alignof
或 GCC__alignof__
以及另一个模板:type_with_alignment
.
从我自己的代码库中,我曾经使用过(来自上面的 GOTW 链接):
#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)
这些天我只依赖 Boost,因为它可能涵盖更多的极端情况和编译器特性