【问题标题】:C++ alignment of multidimensional array structure多维数组结构的C++对齐
【发布时间】:2012-04-11 10:29:35
【问题描述】:

在我的代码中,我必须考虑一个数组数组,其中内部数组具有固定维度。为了利用 STL 算法,将数据实际存储为数组数组很有用,但我还需要将该数据传递给 C 库,该库采用扁平 C 样式的数组。

如果能够以可移植的方式廉价地转换(即展平)多维数组,那就太好了。我会坚持一个非常简单的案例,真正的问题更笼统。

struct my_inner_array { int data[3]; };
std::vector<my_inner_array> x(15);

是

&(x[0].data[0])

指向大小为 45*sizeof(int) 的连续内存块的指针,其中包含与 x 相同的条目?还是我必须担心对齐?恐怕这对我有用(至少对于某些数据类型和内部数组大小),但它不可移植。

  1. 此代码是否可移植?
  2. 如果没有,有没有办法让它工作?
  3. 如果没有,您有什么建议吗?
  4. 如果 my_inner_array 不是 POD 结构,但包含一些方法(只要类不包含任何虚拟方法),它是否会改变任何东西?

【问题讨论】:

  • 首先使用如此大的扁平数组并在适当的地方传递 [p, p + stride) 块是否合适?标准算法强调抽象它们是对整个数组还是部分数组进行操作。
  • @LucDanton:例如,我想将函数应用于顶点数组。我想使用 std::transform(coord.begin(), coord.end(), values.begin(), f);其中 f 是 std::function。我认为没有其他方法可以直接应用 std::transform 或其他 STL 算法。
  • std::transform(coord.begin(), coord.end(), values.begin(), adapt(f)) 其中adapt(f) 返回一个函子,该函子获取元素范围的开始和结束部分以将它们提供给f(假设它可以写成使用迭代器对而不是只是数组开始)。或者,也许您可​​以编写一个通用的f 来处理它本身。如果您使用 Boost.Range 之类的东西,那么您也不需要 adapt 步骤。
  • @LucDanton:啊,这是一个很好的方法。我考虑过编写一个自定义迭代器,但这种方法看起来很干净。 谢谢!我还必须检查 Boost.Range。

标签: c++ data-structures multidimensional-array memory-alignment


【解决方案1】:

1 理论上没有。编译器可能决定向 my_inner_array 添加填充。在实践中,我看不出编译器为什么会向其中包含数组的结构添加填充。在这种情况下,创建此类结构的数组不存在对齐问题。您可以使用编译时断言:

typedef int my_inner_array_array[3];
BOOST_STATIC_ASSERT(sizeof(my_inner_array) == sizeof(my_inner_array_array));

4 如果没有虚拟方法,它不应该有任何区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-14
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2013-06-03
    • 2023-03-27
    • 2013-07-24
    相关资源
    最近更新 更多