C++多维数组结构的对齐方式

5
在我的代码中,我需要考虑一个由内部数组组成的数组,其中内部数组具有固定的维度。为了利用STL算法,实际上将数据存储为数组是有用的,但我还需要将该数据传递给一个接受扁平化C样式数组的C库。
很好能够便宜且可移植地转换(即扁平化)多维数组。我将坚持非常简单的情况,实际问题更加普遍。
struct my_inner_array { int data[3]; };
std::vector<my_inner_array> x(15);

Is

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

这段代码指向一个连续的内存块,大小为45*sizeof(int),包含与x相同的条目。我需要担心内存对齐吗?我担心这个方法只适用于特定的数据类型和内部数组大小,而不是可移植的。

  1. 这段代码是否可移植?
  2. 如果不可移植,有没有办法使其工作?
  3. 如果不能,您有什么建议可以做到这一点?
  4. 如果my_inner_array不是一个POD结构体,但包含一些方法(只要类不包含任何虚方法),这是否会改变任何东西?

首先,在合适的情况下,使用这样一个如此大的、扁平的数组并传递[p,p + stride)块是否是适当的?标准算法强调抽象,无论它们是在整个数组上操作还是在其部分上操作。 - Luc Danton
例如,我想将一个函数应用于一组顶点的数组。我想使用std::transform(coord.begin(), coord.end(), values.begin(), f);其中f是一个 std::function<double (my_inner_array const&)>。我没有看到其他直接应用std::transform或其他STL算法的方法。 - Markus Mayr
std::transform(coord.begin(), coord.end(), values.begin(), adapt(f)) 其中 adapt(f) 返回一个函数对象,该函数对象获取元素范围的开始和结束部分,并将它们提供给 f(假设它可以编写为使用迭代器对而不仅仅是数组)。或者你可以编写一个通用的 f 来处理它本身。如果使用类似 Boost.Range 的东西,则也不需要 adapt 步骤。 - Luc Danton
@LucDanton:啊,这是个不错的方法。我本来想写一个自定义迭代器,但这种方式看起来很干净。谢谢你!我也必须查看Boost.Range。 - Markus Mayr
1个回答

2

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

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

如果没有虚方法,它不应该有任何影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接