gpt4 book ai didi

c++ - 我将如何在 C++03 中可移植地实现对齐的堆栈存储?

转载 作者:IT老高 更新时间:2023-10-28 23:01:20 25 4
gpt4 key购买 nike

在 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 */ }
}

这是否可能,或者您是否被迫使用编译器扩展来实现这一点?

最佳答案

在他的Guru Of The Week #28在专栏中,Herb Sutter 使用 union ,但不如 Boost 的努力强大。

Boost 的 aligned_storage为您解决血淋淋的细节。如果您查看它的实现,您会发现它使用 MSCV 的 __alignof 或 GCC 的 __alignof__ 以及另一个模板:type_with_alignment

来 self 自己的代码库,我曾经使用过(来自上面的 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,因为它可能涵盖更多极端情况和编译器特性

关于c++ - 我将如何在 C++03 中可移植地实现对齐的堆栈存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18323513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com