【问题标题】:Multi-Dimentional array iteration efficiency [duplicate]多维数组迭代效率
【发布时间】:2012-06-15 21:43:24
【问题描述】:

可能重复:
Accessing elements of a matrix row-wise versus column-wise

在 C++ 中,为什么像这样遍历多维数组更高效:

// Iterate through the highest dimention last (k)
int num[10][10][10];

for(int i = 0; i < 10; ++i)
{
    for(int j = 0; j < 10; ++j)
    {
        for(int k = 0; k < 10; ++k)
        {
            cout << num[i][j][k];
        }
    }
}

比这样:

// iterate through the highest dimension first (k)
int num[10][10][10];

for(int k = 0; k < 10; ++k)
{
    for(int j = 0; j < 10; ++j)
    {
        for(int i = 0; i < 10; ++i)
        {
            cout << num[i][j][k];
        }
    }
}

【问题讨论】:

  • 不是完全重复,但接受的答案非常好,回答了这个问题
  • 是的,这个问题的答案回答了我的太多。所以基本上,它更快,因为数组的最后一个维度中的元素一个接一个地存储在内存中,所以如果你遍历最后一个维度,元素会彼此相邻而不是像我最后一个那样在内存中跳转例子?此外,每种语言和每个平台都是这样吗?
  • @cody 对于 C,它可以跨平台移植,但并非所有语言都适用。一个值得注意的例子是 Fortran,其中多维数组按列存储。

标签: c++ arrays


【解决方案1】:

这是因为处理器缓存数据,像int array[n][m][k] 这样的数组在内存中表示,所以首先有元素array[0][0][0]array[0][0][k - 1] 等等。因此,如果您像第一个示例中那样进行迭代,处理器可以将整块内存加载到缓存中,但在第二个示例中,处理器无法“通过”内存进行复制。

【讨论】:

    猜你喜欢
    • 2021-02-18
    • 2023-03-08
    • 2014-05-17
    • 1970-01-01
    • 2021-11-02
    • 2011-11-20
    • 2016-01-28
    相关资源
    最近更新 更多