如何创建char / std :: byte的std :: vector,其中第一个字节与16个字节对齐,但没有填充?

时间:2019-01-25 12:09:35

标签: c++ alignment alignas

有一个现有的question,需要C ++ 03并且没有答案,所以我将打开一个新的答案。

我遇到的问题是我想拥有std::vector中的std::byte,但是要使.data()(数据数组的第一个元素)是16字节对齐的。

包装的char上的

alignas没有帮助,因为我不想在数组中有对齐间隙。 换句话说,我要使元素的对齐方式保持1,但是我要使数组的对齐方式保持16。

理想情况下,我想避免使用自定义分配器。 如果有任何TBB或boost矢量可以满足我的要求,那也很棒。

1 个答案:

答案 0 :(得分:4)

默认情况下,未按矢量对齐数据。甚至没有统一的班级。

进行对齐的最佳方法是使用aligned_allocator增强。

不幸的是,它不能防止填充,它甚至可以使指针适应路线。从C ++ 17开始,它可以使用aligned new(请参见std::aligned_val_t重载)。但是,我见过的所有实现实际上都使用相同的技巧。

另一种选择是一次分配整个页面,然后使用自定义分配器进行自己的内存管理。您可以做到,尽管可能需要很多时间才能正确完成。