C++标准是否保证n维数组的所有元素在内存中连续?
C++中n维数组的内存连续性保证
C++标准明确保证:n维数组的所有元素在内存中是连续存储的,不会在元素之间或数组的维度之间引入填充(空洞)。
核心原理与标准依据
多维数组在C中本质是“数组的数组”,比如uint8_t array[5][7];是一个包含5个元素的数组,每个元素又是一个包含7个uint8_t的数组。根据C标准草案N4861(对应C++20正式版的草案)的[dcl.array]章节:
数组类型的对象包含连续排列的N个元素,每个元素的类型为T。对于多维数组,每一维的元素都是下一维度的数组类型,因此整个多维数组的所有元素构成一个连续的内存序列。
这意味着,uint8_t array[5][7];的内存布局和uint8_t array[35];完全连续,二者的区别仅在于语义(前者是二维数组类型,后者是一维数组类型),内存中没有任何额外填充。
对齐与填充的边界
需要明确的是:
- 数组本身不会因为对齐要求在元素之间添加填充。对齐要求仅作用于单个数组元素的起始地址,数组元素之间的间隔就是元素的实际大小(包括元素类型自身的内部填充,比如结构体成员间的填充)。
- Bitmap中的“stride”是上层逻辑为满足硬件对齐手动添加的额外字节,属于应用层处理,并非C++数组的固有行为,和标准规定的数组连续性无关。
与结构体填充的区别
结构体可能因成员的对齐规则在成员间产生填充,但数组是同类型元素的连续序列,同类型元素的大小固定,因此数组元素之间不会有额外填充。即使数组元素是未按指针大小对齐的结构体,数组中的每个结构体元素也会紧密排列,仅间隔结构体自身的大小(含结构体内部填充),整个数组的内存依然连续。
内容的提问来源于stack exchange,提问作者Thomas W.
相关产品推荐
相关产品推荐

