我将如何在C++03中便携地实现对齐堆栈存储
How would I portably implement aligned stack storage in C++03?
在C++03代码中,如何可移植地实现与给定类型T
具有相同大小和对齐方式的unsigned char[sizeof(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 */ }
}
这是可能的吗?或者你被迫使用编译器扩展来实现这一点吗?
在他的《本周大师》第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,因为它可能涵盖更多的角落案例和编译器特性
像__alignof
和__attribute__((aligned(n))
这样的编译器扩展之所以存在,是因为在C和C++中无法方便地实现确定和强制对齐。也就是说,这个标准不需要任何手段。
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 是否值得对齐变量?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 对齐和对齐的实际用例C++关键字
- 如何减少代码的运行时间以对齐文本?
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- Linux C++ 中的页面对齐内存分配
- 为什么在我的实现中,所有数组都对齐到 16 个字节?
- 使用带有自定义对齐分配器实现的最新g++,使用SSE和-O3选项编译时出现非法指令(核心转储)
- 我将如何在C++03中便携地实现对齐堆栈存储
- 手动填充顶点结构以实现对齐