为什么很少有人按列去遍历访问二维数组呢?

描述

C语言

分享一道360的C语言笔试题。x是一个行列均为1000的二维数组,下面代码运行效率最高的是哪个?

二维数组大家都很熟悉,正常人遍历二维数组都是一行一行来的,为什么很少有人按列去遍历?

这道笔试题其实考察的就是遍历效率的问题。

选项A,j是行,i是列,很显然 x[i][j] 是按列访问,先是第一列第一个元素,然后第一列第二个元素,以此类推。

C语言

选项B和选项C都存在按列访问。

只有选项D,属于正常的按行遍历。

那么问题来了,为什么二维数组按行遍历比按列遍历来的快?

这个涉及的问题就太多了,得从CPU高速缓存讲起。

C语言

CPU处理速度很快,但是访问内存太慢,严重影响了机器运行效率。

于是就出现了高速缓存。

从名字应该能看出,访问它速度确实快。

当CPU发出内存访问请求时,会首先查看缓存内是否有请求的数据,如果有,直接返回,如果没有,就要先把内存中的数据载入缓存,再把它返回给处理器。

由于缓存比内存贵很多,所以它的大小一般都以KB或者MB为单位,如果是一级缓存,那就更小了。

题目中的二维数组大小接近4M,CPU在访问的时候,缓存先从内存抓取数据,而且一般都是抓取相邻整个数据块,简单点理解,就是当前行以及后面的部分数据,这也符合内存访问局部性特征。

如果二维数组按列遍历,就需要不断的抓取内存的数据,降低程序效率,这也将会失去缓存的意义。






审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分