在C++中,这是顺序访问2D数组的方式(内存块方式)

Yew*_*ong 9 c++ arrays

编辑:我从问题标题中删除了更快/更高效,因为它有误导性..我的意图不是优化而是理解数组.抱歉,添麻烦了!

int array[10][10], i, j;

for(i=0;i<10;i++)
{
    for(j=0;j<10;j++)
        std::cin>>array[i][j];
}
Run Code Online (Sandbox Code Playgroud)

int array[10][10], i, j;

for(i=0;i<10;i++)
{
    for(j=0;j<10;j++)
        std::cin>>array[j][i];
}
Run Code Online (Sandbox Code Playgroud)

我很确定答案与如何在硬件级别实现数组有关; [] []语法只是程序员的抽象,以帮助可视化/建模.但是,我忘记了上面的代码从开始到结束依次访问内存块...

感谢所有的答案...

只是为了证实我的理解,这是否意味着第一个代码相当于

int array[10][10], k;

for(k=0;k<100;k++)
{
    std::cin>>*(array+k);
}
Run Code Online (Sandbox Code Playgroud)

Jen*_*ied 14

除了等待获取用户输入将比阵列访问慢得多的事实之外,第一个更快.

如果您想要更多关于主题的背景,请查看有关2D阵列存储器布局的此页面.

你正在检查第二个 A[0], A[10] ... A[1], A[11].

第一个是按顺序进行的 A[0], A[1], A[2] ..


new*_*cct 6

第一个具有更好的空间局部性.因为第一个下标是子数组的索引,第二个下标是该子数组中的元素; 所以当你修复i并改变它们时j,你正在寻找属于一个子阵列的元素,因此它们是紧密相连的; 但是当你修复j并改变它们时i,你会看到10个(子阵列的长度)分开的元素,因此非常分散.