Bra*_*don 4 c++ multidimensional-array
比方说我宣布:
int [a][b][c];
Run Code Online (Sandbox Code Playgroud)
难道一个为水平/页立场,b行和Ç列?
还是可以什么,我想这是即一个代表列,b表示页,ç代表行(因为数据仅仅是数据立方体可以抽象任何方式)?
你想要的任何你想要的顺序,名称行和列只是惯例.内存中的布局将是C++中的http://en.wikipedia.org/wiki/Row-major_order,该部分无法更改.
在许多情况下,如何遍历元素将对性能产生影响.您希望更改最内层循环中最右侧的索引,以便按顺序在内存中移动.
如果你定义:
int my_array[10][10][10];
Run Code Online (Sandbox Code Playgroud)
需要的一件事是关于存储的指数的含义.my_array[1][2][3]在记忆中相邻my_array[1][2][4],但不是my_array[1][3][3].my_array[2][2][3]离得更远了.当您递增一个或另一个索引时,这会影响性能 - 增加最后一个索引通常会更快,因为您获得了更多的缓存命中.
例:
const int K = 400;
int my_array[K][K][K];
int main() {
for (int i = 0; i < K; ++i) {
for (int j = 0; j < K; ++j) {
for (int k = 0; k < K; ++k) {
#ifdef FAST
my_array[i][j][k] = 12;
#else
my_array[k][j][i] = 12;
#endif
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
$ g++ looporder.cpp -o looporder && time ./looporder
real 0m2.500s
user 0m2.249s
sys 0m0.155s
$ g++ looporder.cpp -o looporder -DFAST && time ./looporder
real 0m0.516s
user 0m0.327s
sys 0m0.124s
$ g++ looporder.cpp -o looporder -O3 && time ./looporder
real 0m2.234s
user 0m2.140s
sys 0m0.093s
$ g++ looporder.cpp -o looporder -DFAST -O3 && time ./looporder
real 0m0.250s
user 0m0.171s
sys 0m0.108s
Run Code Online (Sandbox Code Playgroud)
这些指数对于实际存储的内容意味着什么取决于你 - 正如你所说,这只是你的立方体"向上走"的问题.所以通常你会选择它们,这样无论你在最里面的循环中增加什么,都是最后一个维度.