C语言realloc背后的内存管理

malloc申请内存,但不初始化。
calloc申请内存,且初始化为0。
free释放内存。
realloc重新分配已经分配的内存空间,可以变小,也可以变大。

以前一直有一个疑问,realloc是不是经常失败?
其实,realloc失败时,malloc基本也会失败。
物理内存以一页4096Bytes为单位分配,经过多级内存映射为进程的虚拟内存地址。
当malloc 4096B时,比较好理解,就是映射了一块物理内存。
如果realloc它,怎么保证物理内存紧挨着的4096B也没被占用?
其实不用保证,malloc两个页内存时,虚拟地址连续,实际物理地址可能是交错分布在不同内存条上(往往是不同内存通道)。
而且,realloc失败,系统会重新找多块内存拼起来返回给用户,且之前的内存数据被自动拷贝到新分配的空间,对于用户来讲,这个是无感的。
用户只需要注意将realloc返回的值更新到所有用到的地方,或者最好只有一个指针对象存储这个地址。
另外:物理内存的强制分配可以调查numa、libnuma等,github上搜索numa即可。

注:以上理解都未进行实际代码验证。

你可能感兴趣的:(cpp,c语言)