具有 4 字节对齐缓冲区的 C++ `std::string` 类容器

标签 c++

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

到目前为止,我一直在使用 std::stringstd::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/

相关文章:

c++ - 链接器如何在翻译单元之间处理相同的模板实例化?

c++ - 如何初始化结构上的 vector vector ?

c++ - 语义操作(使用 _val 和 _attr)如何影响 %= 和 x3::rule 的 force_attribute=true 的规则定义?

c++ - 在C++中的特定线程上执行函数

c++ - 在函数中引用自动数组迭代器

c++ - 神经网络mlp麻烦

c++ - 了解哪个 Mac 进程正在加载我的库框架

c# - 我有 .H 文件,如何将其公共(public)方法打开到 .Net 库?

c++ - 如何在Qt C++中更新QWindow,文本不显示

使用对作为键的 C++ 映射