【问题标题】:std::string and data alignmentstd::string 和数据对齐
【发布时间】:2015-05-15 10:47:33
【问题描述】:

我打算使用std::string 作为通用数据缓冲区(而不是我自己的)。我需要将各种 POD 打包到其中,包括用户定义的结构,std::string 分配的内存缓冲区是否为此目的正确对齐?

如果C++标准中没有规定,那么libstdc++是什么情况?

主机 CPU 是 x86_64。

【问题讨论】:

  • 为什么是std::string 而不是std::vector
  • 我不关心容器只要内存缓冲区对齐,std::vector的缓冲区是否保证对齐?
  • 顺便说一句,打包到容器中的数据大小不同,我需要自己解释缓冲区。
  • 所以,std::basic_string 可能会满足 16 字节对齐(x86_64 CPU 需要),对吧?

标签: c++ memory-alignment


【解决方案1】:

首先,如果您想要存储任意数据,std::string 可能不是最好的容器。我建议改用std::vector

其次,容器进行的所有分配的对齐方式由其分配器控制(第二个模板参数,默认为std::allocator<T>)。默认分配器将根据最大标准类型的大小对齐分配,在我的机器上通常是 long longlong double,分别为 8 和 16 个字节,但这些类型的大小不是标准规定的。

如果您需要特定的对齐方式,您应该检查编译器的对齐方式,或者通过提供您自己的分配器或使用 std::aligned_storage 来明确要求对齐。

【讨论】:

  • 如果我理解正确,分配器将用于进行容器所需的任何分配...这意味着 std::basic_string 的 data() 将位于 somewhere在分配器分配的一些内存中。但是你确定它保证在分配器分配的一块内存的开始?例如,我可以想象一些实现可能会将 basic_string 的 data() 定位在开头之后的 4 或 8 或 12 个字节处。
  • 在阅读第 24.3.2.7.1 节时,我看不到任何保证 data() 指向已分配内存块的 开始。你确定你引用了正确的部分吗? (顺便说一句,您提供的链接指向在我看来像一个移动目标;作为参考,它目前是字符串库/字符串类/类模板基本字符串/字符串操作/访问器,在某些版本的 c++ 规范的某些草案中。)跨度>
  • 不确定我的重点是否得到传达。我一直在强调“开始”这个词,因为这是问题的症结所在。
  • “按要求对齐”是什么意思?这个问题是关于 basic_string 的 data() 是否有任何对齐保证。据我所知,从未提出过任何对齐请求。
  • 我对你这句话的解读“默认分配器会根据最大标准类型的大小对齐分配,这在我的机器上通常是 long long 或 long double,分别为 8 和 16 个字节,但大小这些类型中的任何一个都不是标准规定的。”是您的意思是暗示 data() 具有相同的对齐保证。如果您不想这么说,那么为清晰起见进行编辑可能会有所帮助。
猜你喜欢
  • 2017-02-11
  • 1970-01-01
  • 2015-08-11
  • 2021-07-12
  • 2012-01-05
  • 2012-10-14
  • 2017-11-11
  • 2020-09-17
  • 1970-01-01
相关资源
最近更新 更多