是否严格定义了三维数组的下标?

Bra*_*don 4 c++ multidimensional-array

比方说我宣布:

int [a][b][c];
Run Code Online (Sandbox Code Playgroud)

难道一个为水平/页立场,b行和Ç列?

还是可以什么,我想这是即一个代表列,b表示页,ç代表行(因为数据仅仅是数据立方体可以抽象任何方式)?

Joh*_*ler 7

你想要的任何你想要的顺序,名称行和列只是惯例.内存中的布局将是C++中的http://en.wikipedia.org/wiki/Row-major_order,该部分无法更改.

在许多情况下,如何遍历元素将对性能产生影响.您希望更改最内层循环中最右侧的索引,以便按顺序在内存中移动.

  • 卡尔,没有指针,只有阵列.数组元素是连续存储的. (5认同)
  • @Carl:那不是真的.C和C++都允许您将多维数组定义为连续内存.限制是当它们作为参数传递时,除了最后一个维度之外的所有维度(在本例中为3个中的2个)都是该类型的一部分,因此只有最后一个维度可以在运行时变量. (2认同)

Ste*_*sop 7

如果你定义:

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)

这些指数对于实际存储的内容意味着什么取决于你 - 正如你所说,这只是你的立方体"向上走"的问题.所以通常你会选择它们,这样无论你在最里面的循环中增加什么,都是最后一个维度.