在C ++ 03代码中,我如何移植实现与给定类型unsigned char[sizeof(T)]
具有相同大小和对齐的T
缓冲区?
例如:
template<class T>
void test()
{
unsigned char buffer[sizeof(T)]; // <----- how do I ensure this is aligned?
if (some_condition())
{
T *const obj = new(buffer) T();
// ...
obj->~T();
}
else { /* use 'buffer' for something else */ }
}
这是否可能,或者你是否被迫使用编译器扩展来实现它?
答案 0 :(得分:7)
在他的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,因为它可能涵盖更多角落案例和编译器特性
答案 1 :(得分:2)
存在像__alignof
和__attribute__((aligned(n))
这样的编译器扩展的原因是,在C和C ++中无法实现确定和实施对齐。即标准无需这样做。