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