C++与Java二维数组存储顺序差异:为何C++要求行优先而Java无固定规则?
为什么同样是「数组的数组」抽象,Java二维数组无行/列优先要求,C++却规定行优先存储
核心原因是二者的「数组的数组」抽象对应的底层内存实现逻辑完全不同:
- Java的二维数组是引用嵌套数组:最外层数组存储的是指向各个一维子数组的引用,各个子数组的内存地址不需要连续,甚至可以是长度不同的锯齿数组,不存在把整个二维数组映射为一块连续内存的要求,自然没有行优先/列优先的说法。
- C++的原生二维数组(即
T arr[M][N]这类静态声明的数组)是连续内存的语法包装:编译器会直接开辟M * N * sizeof(T)大小的整块连续内存,「数组的数组」只是上层的逻辑抽象,本质是给连续内存块提供按行/按列访问的语法。
C++标准规定行优先的存储顺序,本质是给这类连续内存的二维数组定义统一的内存布局规则,方便开发者做缓存优化、内存对齐、跨模块数据传递等底层操作。比如声明
int a[2][3]时,内存的存储顺序固定为a[0][0]、a[0][1]、a[0][2]、a[1][0]、a[1][1]、a[1][2],存完一整行再存下一行。
注意如果是C++中手动用int**申请的动态锯齿数组,每个子数组内存不连续,这种场景下也和Java一样没有行优先/列优先的约束。
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

