C ++`std :: string`-like容器,带有4字节对齐的缓冲区

时间:2018-02-08 19:43:25

标签: c++

我需要一个C ++中的数据结构,它像一个标准的字节容器,但是以四个字节的倍数对齐缓冲区。我想尽可能地重复使用标准库抽象,而不是滚动我自己的抽象。

到目前为止,我一直在使用std::stringstd::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()做同样事情的内容,即使现在这似乎有效。

1 个答案:

答案 0 :(得分:1)

其中一个解决方案是在内部使用std::vector<uint32_t>,将其封装并在您使用时将data()转换为unsigned char *