就像标题所说,什么是连续的内存块?
以下是一个由5个字节组成的连续内存块,从位置1到位置5:
其中的字节(浅蓝色)在内存中相邻且没有空白字节(白色)。
这是一组由5个字节组成的非连续字节:
它被分成了三组黄色字节,并且在位置4和位置6之间有空白字节。从位置1开始,有一个由3个字节组成的连续块,它跨越了位置1到位置3。还有两个单独的1字节块分别位于位置5和位置7。
通常可以忽略位置0处未使用的块以及位置7之后的任何后续块,因为它们不会干扰跨越位置1到位置7的感兴趣的字节。
指地址连续的空间。你可以把它简单理解为一个“块”,而有中间间隔的则可以视为“两个块”。
该术语出现在数组的定义中,被称为“连续的”。这意味着元素是端对端布局的,没有不连续性和没有它们之间的填充(每个元素内部可能有填充,但是在元素之间没有)。因此,一个5个4字节元素的数组看起来像这样(每个字节用1个下划线字符表示,|符号不代表内存):
____ ____ ____ ____ ____
|____|____|____|____|____|
它看起来不像这样:
____ _ ____ _ ____ _ ____ _ ____
|____|_|____|_|____|_|____|_|____|
也不像这样:
____ ____ ____ ____ ____
|____|____|____| ... somewhere completely different ... |____|____|
在所有情况下,“看起来像”意味着“就C中可见的地址而言”。某些内容可能在虚拟地址空间中连续,但在物理RAM中并非连续。同样,某些内容可能在物理RAM地址空间中连续,但实际上在物理RAM中并非相邻。其中一半可以位于这里的一个RAM芯片上,另一半则位于那里的另一个RAM芯片上。但是C内存模型无法“看到”其中任何内容。
一块不被其他内存打断的内存块。更准确地说,它需要一块不间断的虚拟地址空间。支持该地址空间的实际RAM不需要是连续的。
如果您分配了一个大的内存块,则这一点非常重要。操作系统必须将其作为连续块提供给您,但如果内存如此分散,以至于只有较小的部分是空闲的,则即使总的空闲内存大于请求的空间,也无法满足此内存分配。
在64位应用程序中,这不是太大的问题,因为地址空间很大。但在32位进程中,堆可能会变得如此分散(在已释放的块之间仍然存在未释放的块),以至于较大的分配会失败。
当内存块在单一线性地址空间中由起始地址和结束地址定义且没有空洞时,它是连续的。
内存由大量字节块组成,每个块都有自己的地址。 当进程请求内存时,内存分配有两种方式:
在连续内存分配中,分配连续的(一个接一个的)块,这些块被称为连续内存块。
在非连续内存分配中,分配位于不同位置的单独块。