我正在我的程序中编写一个自定义内存分配器,并试图更好地理解什么是已分配内存和未分配内存。有人告诉我,对于一个基本的“幼稚”sbrk()
内存分配器,调用sbrk()
必须提供与 16 字节(的倍数)对齐的大小。这意味着如果我需要分配例如 5 个字节的内存,则应用 (5 + (16-1)) & ~(16-1)) 操作,在这种情况下四舍五入为 16。如果请求的大小是 17 而不是 5,那么它将四舍五入为 32。
这意味着我们从操作系统返回的字节数超过了用户为对齐而请求的字节数。我的问题是,11 个字节(在第一个示例的情况下)或 15 个字节(在第二个示例的情况下)是否被视为“已分配”?在内存分配器的正确实现中,用户实际上是否可以在请求的大小和 16 字节边界之间使用超过请求的字节?如果没有,如何执行?