使用boost的多维固定大小数组

时间:2013-02-08 10:51:01

标签: c++ boost multidimensional-array

我想typedef使用boost库的多维数组。矩阵是矩形的,每个维度的尺寸和长度应固定在typedef内。如果是向量,这正是boost::array模板类解决​​的问题:

typedef boost::array<int, 3> vec3_t;

对于多维数组,我可以重复这种结构

typedef boost::array<boost::array<int, 2> ,3> mat2x3_t

它允许我也很好地初始化我的矩阵(虽然我不确定这种行为是否得到保证......):

Mat2x3_t m = { 11, 12, 13,
               21, 22, 23};

然而,从表现的角度来看,我不确定这是否可行。我对内存管理的理解非常有限,但我在计算机内存中想象的方式是,保证最内层数组(上例中的boost::array<int, 2>)分配一个连续的内存块,而对于数组的“更高级别”我不确定。

我还查看了boost::multi_array类,根据我的理解,整个矩阵将占用一个连续的内存块,非常适合我感兴趣的“矩形”矩阵。进一步提供了一些整洁的成员函数(这对我的实现并不重要,但仍然是一个很好的补充)。然而,这个类的交易破坏者似乎不能typedef每个维度的长度,而只是维度的数量。

所以我的问题是:当我不得不经常迭代它(~10 ^ 7次)时,多个数组的构造是否会导致性能问题?在我的例子中,我使用了一个2x3的int矩阵,但我的用例是一个复杂数字的高维64x4x2矩阵。并且,是否通过实现保证花括号的初始化? 如果数组存在问题,是否有办法输入固定大小的multi_array?或者是我缺少的其他选择?

1 个答案:

答案 0 :(得分:2)

boost::array<T, N>(就像它的现代表亲std::array<T, N>defined to have只有一个数据成员:

// public data members
T elems[N];

是Ts的连续序列。如果每个T依次是一个数组,那么整个事情是连续的(从技术上讲,由于elems之前或之后的填充可能存在间隙,但在这种情况下不允许使用前导填充,并且尾随填充是不现实的。

Brace初始化和支撑省略是有保证的,尽管有些编译器喜欢在他们认为你没有足够的支撑时发出警告。