【问题标题】:Multidimensional fixed-size arrays using boost使用 boost 的多维固定大小数组
【发布时间】:2013-01-24 02:51:56
【问题描述】:

我想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&lt;int, 2&gt;)保证分配一个连续的内存块,而对于“更高级别”的数组我不确定。

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

所以我的问题是: 当我必须大量迭代(~10^7 次)时,多个数组的构造是否会导致性能问题?在我的示例中,我使用了 2x3 int 矩阵,但我的用例将是具有复数的高维 64x4x2 矩阵。而且,实现是否保证了花括号的初始化? 如果数组有问题,有没有办法typedef一个固定大小的multi_array?还是我缺少其他选择?

【问题讨论】:

    标签: c++ boost multidimensional-array


    【解决方案1】:

    boost::array&lt;T, N&gt;(就像它的现代表亲 std::array&lt;T, N&gt;)是 defined to have 只是一个数据成员:

    // public data members
    T elems[N];
    

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

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

    【讨论】:

    • 谢谢,这很有帮助!我想我的困惑来自第一次尝试使用std::vector&lt; std::vector&lt;int&gt; &gt;,在这种情况下,我认为不同大小的“内部”向量可能会导致问题
    猜你喜欢
    • 2023-04-03
    • 2014-11-10
    • 2012-03-17
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多