如何创建 std::vector of char/std::byte,其中第一个字节对齐到 16 个字节,但没有填充
How to create std::vector of char/std::byte where first byte is aligned to 16 byes, but there is no padding?
有一个现有的问题需要C++03并且没有答案,所以我将打开一个新问题。
我遇到的问题是我想std::vector
std::byte
,但.data()
(数据数组的第一个元素)是 16 字节对齐的。
在包装的字符上alignas
无济于事,因为我不想在数组中出现对齐间隙。换句话说,我想对元素进行 1 的对齐,但我希望数组的对齐方式为 16。
理想情况下,我想避免使用自定义分配器。如果有任何 TBB 或增强矢量可以做我想要的,那也很棒。
默认情况下不提供对齐向量中的数据。甚至对于对齐的类也不行。
进行对齐的最佳方法是使用提升aligned_allocator。
不幸的是,它不会阻止填充,它甚至过度分配以适应对齐方式上的指针。从 C++17 开始,它可以使用对齐的新(请参阅重载std::aligned_val_t
)。但是,我见过的所有实现实际上都使用相同的技巧。
另一种方法是一次分配整个页面,并使用自定义分配器执行自己的内存管理。您可以做到这一点,尽管正确执行可能需要很多时间。
相关文章:
- std::当在256字节边界上写入整数时,流的奇怪行为
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 如何将原始字节附加到 std::vector?
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- 如何在C++中将字节向量(std::vector<uint8_t>)转换为不同的uint32_t,uint16_t和uint8_t变量
- 如何将带有空字符的字节数组馈送到 std::iostream 中?
- Swig无法将python3的字节对象转换为std::string
- 如何从Little Endian UTF-16编码字节中获取C++std::string
- 比较存储在 std::string 中的数据中的字节数
- libc++ 的 std::basic_string 的 16 字节对齐模式背后的原因是什么?
- std::字符串到字符*而不切割字节
- std::memcmp 可以读取超过第一个差异的任何字节吗?
- std::字符串与字节缓冲区(C++的差异)
- 在 std::string 中使用非法的 UTF-8 八位字节作为分隔符
- 如何将字节从 std::ostream 流式传输到 std::vector<uint8_t>?
- 用字节初始化 char* 和 std::字符串
- std :: string的解密具有额外的填充字节
- 为什么标准库不以无锁的方式为 8 字节以下的结构实现 std::atomic?
- C++ 17 中的 std::byte 等同于 C# 中的字节
- STD功能替换向量中的字节范围