我想使用 boost 库typedef
一个多维数组。矩阵是矩形的,每个维度中的尺寸和长度应固定在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进行 typedef?还是我缺少其他选择?
boost::array<T, N>
(就像它的现代表亲std::array<T, N>
一样(被定义为只有一个数据成员:
// public data members
T elems[N];
这是 T 的连续序列。如果每个 T 依次是一个数组,则整个事情是连续的(从技术上讲,由于elems
之前或之后的填充可能存在间隙,但在这种情况下不允许前导填充,并且尾随填充是不现实的。
初始化和大括号省略是有保证的,尽管一些编译器喜欢在他们认为您没有足够的大括号时发出警告。