【问题标题】:Creating a word aligned char vector创建单词对齐的字符向量
【发布时间】:2018-01-11 10:41:29
【问题描述】:

我需要创建一个原始缓冲区数据类,它必须返回一个指向char 的指针,保证字对齐。

我正在考虑使用std::vector<<something>> vec

我知道std::vector 的大多数(如果不是全部)实现将使用operator new 来分配保证返回最大对齐内存的内存,但我不想依赖它。

我也不想创建自己的对齐分配器。看起来有点矫枉过正。

这是我想出的:(假设uintptr_t 保证有字长)

typedef uintptr_t WORD_TYPE;

std::vector<WORD_TYPE> vec;

然后我用它来访问数据:

reinterpret_cast<char*>(vec.data());

我看不出这种方法有什么问题。考虑到列出的要求,这是正确的还是有更好的方法?

【问题讨论】:

  • @Jarod42 我不明白。
  • 你想用你的向量作为缓冲区吗?或使用它(push_back('*');)?
  • @Jarod42 严格作为缓冲区。封闭类只会使用问题中列出的表达式公开getData() 方法。
  • 为什么不使用alignas 作为alignas(128) char cacheline[128];
  • @Jarod42 我必须动态调整大小,并且必须在 C++03 上编译,所以不能使用 alignas

标签: c++ vector alignment c++03


【解决方案1】:

this SO 帖子中接受的答案指出new 运算符确实保证任何对象类型的对齐。只需使用std::vector&lt;char&gt; 即可满足您的需求;就像你说的,std::vector 在我见过的每个实现中都使用new,这意味着至少是字对齐。

【讨论】:

  • 我确实需要动态调整大小。即使在实践中,我也不能依赖vectoroperator new 一起实现。
  • 那么如果你不需要在运行时调整缓冲区的大小,我建议创建一个类,使用new[]在构造函数中分配所需长度的unsigned char[]数组,delete[]在析构函数中,还有一个 getData() 方法。如果您不信任 new 的对齐方式,则可以使用两个指针创建类;一个分配和取消分配内存,分配一个字减去一个字节的额外内存,另一个从第一个地址开始并向前迭代,直到它指向的地址正确对齐。然后第二个指针将用于对齐的 getData()。
  • 我可能不得不这样做。
  • @imreal 如果你使用 2 指针方法 - 你不需要自己分配 - 使用向量作为存储,并在向量内对齐开始的指针
猜你喜欢
  • 2019-04-09
  • 2014-09-25
  • 2020-02-28
  • 2012-06-13
  • 1970-01-01
  • 2015-02-18
  • 2015-09-20
  • 2021-04-05
  • 2015-06-02
相关资源
最近更新 更多