代码之家  ›  专栏  ›  技术社区  ›  NoSenseEtAl

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

  •  4
  • NoSenseEtAl  · 技术社区  · 7 年前

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

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

    alignas 在包装字符上没有帮助,因为我不希望数组中有对齐间隙。 换句话说,我想让元素对齐1,但数组对齐16。

    理想情况下,我希望避免使用自定义分配器。

    1 回复  |  直到 7 年前
        1
  •  4
  •   JVApen    7 年前

    默认情况下,不提供在向量中对齐数据。甚至对于对齐的类也是如此。

    aligned_allocator

    不幸的是,它不能阻止填充,甚至会过度分配以适应对齐上的指针。从C++17中,可以使用 aligned new (见 std::aligned_val_t 重载)。然而,我看到的所有实现实际上都使用相同的技巧。

    另一种方法是一次分配整个页面,并使用自定义分配器进行自己的内存管理。您可以这样做,但可能需要很多时间才能正确完成。