我写一个realloc函数,目前我的realloc处理两种情况(不包括空的情况下)优化realloc函数
- 如果存在旁边块足够的内存,展开它
- 其他分配一个新的块和做一个memcpy
我的问题是,有没有更多的情况下,我应该处理?我想不出任何。
我想到了一个情况,其中前一个区块可能是免费的,并扩大我前面的块,但这将需要一个memcpy,所以这将是毫无意义的实现。
我写一个realloc函数,目前我的realloc处理两种情况(不包括空的情况下)优化realloc函数
我的问题是,有没有更多的情况下,我应该处理?我想不出任何。
我想到了一个情况,其中前一个区块可能是免费的,并扩大我前面的块,但这将需要一个memcpy,所以这将是毫无意义的实现。
包括新尺寸小于旧尺寸的情况;理想情况下,你应该分割你的当前块并使其结束。
是的,这是作业的一部分。感谢您提醒我关于重新调整大小减小块大小的情况。我会尝试一下,看看我的内存利用率增加了多少(我的教授对利用率和吞吐量进行了测试)。 – user1022223
有些情况下,realloc通过一个非常重要的数值来减少块大小,这是值得回收用于其他地方的分配。
您可以努力优化realloc
的性能(即避免移动块和memcpy
),或者您可以针对内存碎片进行优化。
如果是后者,你可以考虑移动块来填补最好的空白,而不是扩大或缩小它。
内存分配器总是一个权衡。
乱用内存分配例程是非常危险的;大多数已经在物理上可以优化,而不会影响安全性。你可能做的任何优化都可能会打开一个可以被利用的漏洞 - 目前有很多“免费使用”风格的安全问题。
考虑到这一点,更好的地方看起来比OpenBSD的它的源代码:http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/malloc.c?rev=1.140;content-type=text%2Fx-cvsweb-markup
是,一个运动(无论是自我强加或家庭作业)?任何stdlib的realloc应该已经表现如此。我没有遇到过,但没有。关于这个问题,你已经涵盖了我能想到的所有案例。 –
考虑'相同大小'的情况 - 不太可能,但确保没有任何破坏。 –