内存管理功能保证如果内存被分配,那么它将适当地与任何具有基本对齐的对象对齐。基本对齐小于或等于没有对齐规范的实现所支持的最大对齐。
动态内存分配的主要问题之一是碎片,基本上,碎片发生在用户没有有效使用内存时。有两种类型的碎片,外部碎片和内部碎片。
外部碎片是由于空闲列表上可用但程序无法使用的小空闲内存块(小内存洞)造成的。有不同类型的空闲列表分配算法可以有效地使用空闲内存块。
为了理解外部碎片,考虑一个程序有 3 个连续的内存块并且用户释放中间的内存块的场景。在这种情况下,如果所需的内存块大于单个内存块(但小于或等于内存块的总和),将不会获得内存。
内部碎片浪费了为四舍五入分配的内存而分配的内存,在簿记(基础设施)中,簿记用于保存已分配内存的信息。每当我们调用 malloc
函数时,它都会保留一些额外的字节(取决于实现和系统)用于簿记。 这个额外的字节是为每次调用 malloc
保留的,并成为内部碎片的原因。
例如
参见下面的代码,程序员可能认为系统将分配 8 *100 (800)
字节的内存,但由于簿记(如果 8 字节)系统将分配 8*100
额外的字节。 这是一个内部碎片,其中 50% 的堆浪费。
//Only sample code. #include <stdio.h> #include <stdlib.h> char *acBuffer[100]; int main() { int iLoop = 0; while(iLoop < 100) { acBuffer[iLoop ] = malloc(8); ++iLoop; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。