【发布时间】:2011-11-17 21:04:43
【问题描述】:
在 Linux/Glibc、Windows/MSVC 和 BSD/Mac OS X 等常见实现中,会
void *p = malloc(N + M); // assume this doesn't fail
p = realloc(p, N); // nor this
对于N,M > 0,实际上缩小了malloc 在realloc 调用中返回的缓冲区,从某种意义上说,最多M 字节可能会返回到空闲列表?更重要的是,它是否有可能重新分配缓冲区?
我想知道,因为我刚刚在numpy.ndarray 之上实现了动态数组,并且我正在做一个resize,它调用realloc,以获得正确的最终大小。我也许可以跳过最后的 resize 作为优化(以永久过度分配为代价),我想知道这是否值得尝试。
【问题讨论】:
-
@jterrace 你将如何测试内部实现是否缩小了你拥有的内存大小?
-
在某些实现中,当您调用
malloc或realloc...时,甚至不会分配内存... -
看看指针的值是否真的改变了会很有趣。比较
p前后的值。如果它确实发生了变化,那么您就知道发生了某事。 -
@Joe 是的,但也请记住,如果它不改变,你不知道某事不正在发生。
-
你不能假设
realloc()在这种情况下不会重新分配缓冲区。原因之一是realloc()可能会选择这样做是为了尽量减少碎片。有实现依赖。最好在这些平台上查看realloc()的官方接口文档。为了实现最大的可移植性,建议不要假设超出文档“按合同”提供的任何内容。
标签: python c memory-management numpy malloc