我需要一个 C++ 中的数据结构,它的作用类似于标准的字节容器,但将缓冲区对齐为四个字节的倍数。我想尽可能多地重用标准库抽象,而不是滚动我自己的抽象。
到目前为止,我一直在使用 std::string
和 std::vector<std::uint8_t>
来达到这个目的。不幸的是,我收到了有关最新 Mac OS 的错误报告,显然 string::data()
不再是 4 字节对齐的,而是地址与 1 mod 4 一致。当我看到这个时,我当然没有意识到规范保证字符串将按 4 字节对齐。我可以切换到 vector<char>
,但不幸的是现在我不确定为什么这应该是 4 字节对齐的。即使使用自定义分配器,vector
实现也可能在它分配的缓冲区开始时做一些奇怪的事情。
我的问题:从 C++ 标准库中获取动态大小的单字节对象容器的简单方法是什么,其中第一个字节位于 4 字节对齐地址并且可以通过 operator[]
访问各个字节?
请注意,这与询问如何确保容器使用的分配器返回 4 字节对齐的内存不同。例如,std::string
仍然分配 4 字节对齐的内存(实际上可能是 8 个),只是在 Mac OS 上 string::data()
没有指向分配缓冲区的开始。我在规范中看不到任何可以阻止 vector<char>
执行相同操作的内容,尽管目前这似乎可行。
最佳答案
解决方案之一是使用 std::vector<uint32_t>
在内部,封装并转换 data()
至 unsigned char *
当你使用它时。
关于具有 4 字节对齐缓冲区的 C++ `std::string` 类容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48693559/