c++ - 嵌套std::arrays中的数据是否保证是连续的?

标签 c++ multidimensional-array c++11

std::array<std::array<T,N>, M>中的数据是否保证是连续的?例如:

#include <array>
#include <cassert>

int main()
{
    enum {M=4, N=7};
    typedef std::array<char,N> Row;
    typedef std::array<Row, M> Matrix;
    Matrix a;
    a[1][0] = 42;
    const char* data = a[0].data();

    /* 8th element of 1D data array should be the same as
       1st element of second row. */
    assert(data[7] == 42);
}

断言可以保证成功吗?或者换一种说法,我可以依靠Row末尾没有填充吗?

编辑:为了清楚起见,对于此示例,我希望整个矩阵的数据是连续的。

最佳答案

不,在这种情况下不能保证连续性。
std::array保证是一个聚合,并且以这样的方式指定:用于存储的基础数组必须是该类型的第一个数据成员。

但是,没有要求sizeof(array<T, N>) == sizeof(T) * N,也没有要求在对象的末尾没有未命名的填充字节,或者std::array除了底层数组存储之外没有其他数据成员。 (尽管如此,包含额外数据成员的实现充其量是不寻常的。)

关于c++ - 嵌套std::arrays中的数据是否保证是连续的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60883082/

相关文章:

c++ - 部分专用模板作为模板参数

c++ - 不使用元素复制赋值运算符复制 vector - 可移植性

java - 识别数组中的连接元素

c++ - 如何在保持原始索引的同时对 vector 的 vector 进行排序?

c++ - 强制实例化模板类中的静态成员

c++ - 抽象类的链表?

python - Cython:C++ 在字典中使用 vector ?

python - 打印 NumPy 数组时的轴顺序

c++ - 如何使用 auto 声明数组

c++ - 按模式分割 vector