C语言内存布局:揭开行主序存储的底层秘密
行主序(Row-major Order):C 语言的存储规则
二维数组 arr[m][n]
在内存中按以下顺序存储:
arr[0][0] → arr[0][1] → … → arr[0][n-1] → arr[1][0] → … → arr[1][n-1] → … → arr[m-1][n-1]
数学公式:元素 arr[i][j] 的内存地址 = 首地址 + (i * n + j) * sizeof (type)。
案例:二维数组地址计算
假设 int arr[2][3] 首地址为 0x1000,sizeof(int)=4:
arr[0][0] 地址:0x1000
arr[0][1] 地址:0x1004(+4 字节)
arr[1][0] 地址:0x100C(0x1000 + 134 = 0x100C)
4.2 三维数组的存储扩展
三维数组 arr[a][b][c] 的存储顺序:
先填满第 0 个二维数组(arr[0][*][*]),按行主序存储;
再填第 1 个二维数组(arr[1][*][*]),依此类推。
地址公式:arr[i][j][k] 地址 = 首地址 + (ibc + j*c + k) * sizeof(type)。
4.3 内存布局对性能的影响
正向案例:按行遍历二维数组(符合行主序)时,数据在内存中连续,CPU 缓存命中率高,速度极快。
// 高效遍历(行优先)
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
sum += arr[i][j]; // 内存连续访问
}
}
反向案例:按列遍历(跨行访问)时,每次访问都可能引发缓存未命中,速度下降 50% 以上。
// 低效遍历(列优先)
for (int j = 0; j < n; j++) {
for (int i = 0; i < m; i++) {
sum += arr[i][j]; // 每次跳n个元素,内存不连续
}
}
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
7. 本站有不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
66源码网 » C语言内存布局:揭开行主序存储的底层秘密