任何人都可以解释一下记忆的布局
std::vector<std::array<int, 5>> vec(2)
Run Code Online (Sandbox Code Playgroud)
它是否提供具有2行5个元素的2D数组的连续内存块?
据我所知,矢量矢量
std::vector<std::vector<int>> vec(2, std::vector<int>(5))
Run Code Online (Sandbox Code Playgroud)
提供存储器中不同位置的两个 长度为 5个元素的连续数组的存储器布局.
对于数组的向量是否相同?
在C++ 11 std::array中定义的连续存储和性能并不比数组差,但我不能确定标准的各种要求是否意味着std :: array具有与普通数据相同的大小和内存布局阵列.那是你可以指望的sizeof(std::array<int,N>) == sizeof(int)*N还是具体的实施?
特别是,这保证按照您期望的方式工作:
std::vector< std::array<int, N> > x(M);
typedef (*ArrayPointer)[N];
ArrayPointer y = (ArrayPointer) &x[0][0];
// use y like normal multidimensional array
Run Code Online (Sandbox Code Playgroud)
它适用于我尝试过的两个编译器(GNU和Intel).此外,我能找到的所有第三方文档(如下所示)都表明std :: array与普通数组一样具有内存效率,它与连续需求相结合意味着它必须具有相同的内存布局.但是我在标准中找不到这个要求.
使用T[][][]语法定义多维数组很容易.但是,这会创建一个原始数组类型,它不适合现代C++.这就是我们std::array从C++ 11开始的原因.但是使用多维数组来定义多维数组的语法std::array非常混乱.例如,要定义三维int数组,您必须编写std::array<std::array<std::array<int, 5>, 5>, 5>.语法根本不可扩展.我要求解决这个问题.也许,使用C++提供的现有实用程序无法修复此问题.在这种情况下,我很高兴开发了一种自定义工具来简化语法.
自己找到了解决方案:
template <typename T, std::size_t n, std::size_t... ns>
struct multi_array {
using type = std::array<typename multi_array<T, ns...>::type, n>;
};
template <typename T, std::size_t n>
struct multi_array<T, n> {
using type = std::array<T, n>;
};
template <typename T, std::size_t... ns>
using multi_array_t = typename multi_array<T, ns...>::type;
Run Code Online (Sandbox Code Playgroud)
想知道是否可以进一步简化实施.
c++ arrays multidimensional-array template-meta-programming c++14
数据是否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);
}
Run Code Online (Sandbox Code Playgroud)
断言保证成功吗?或者,换句话说,我可以依靠在结尾处没有填充Row吗?
编辑:为了清楚,对于这个例子,我希望整个矩阵的数据是连续的.