对于序列化系统,我需要分配缓冲区来写入数据。所需的大小事先未知,因此基本模式为malloc
N
个字节,如果需要更多,则使用realloc
。 N
的大小足以容纳大多数对象,因此重新分配很少。
这让我觉得malloc
可能比其他人更容易满足最佳的初始字节数。我猜是接近pagesize
的某个地方,虽然不一定确切malloc
需要一些管理空间。
现在,我确定这是一个无用的优化,如果真的很重要,我可以使用游泳池,但我很好奇;我不能成为第一个认为给我任何大块字节最容易分配为开始的程序员。有没有办法确定这个?
任何特别适用于现代GCC / G ++和/或Linux的答案都将被接受。
答案 0 :(得分:2)
从阅读this wiki页面看,您的答案会有很大差异,具体取决于您使用的malloc和操作系统的实现情况。在OpenBSD的malloc上阅读这一点特别有趣。听起来你也想看看mmap,但是我猜测我会说分配默认的pagesize(4096?)会被优化。
答案 1 :(得分:1)
我给你的建议是找到一个合适的malloc / realloc / free源代码,这样你就可以在同一个源模块(和使用相同的内存结构)中实现自己的“malloc_first”和其他简单分配的返回大于或等于传递的minimum_bytes参数的第一个可用块。如果通过0,您将获得第一个块周期。
适当的声明可以是
void *malloc_first (size_t minimum_bytes, size_t *actual_bytes);
这样的事业是多么可行,我不知道。我建议你尝试使用所有源代码都可用的Linux。
答案 2 :(得分:-1)
在类似情况下完成的方式是第一个malloc
分配一些重要但不太大的块,这适合大多数情况(如您所述),以及每次后续realloc
调用加倍要求的大小。
所以,如果你首先分配100,那么下次你将realloc
200,然后400,800等等。这样,每次进行后续重新分配的机会都会降低。
如果记忆对我有用,那就是std::vector
表现的方式。
最佳的初始分配大小将是一方面覆盖大多数情况的大小,但在另一方面不会太浪费。如果您的平均情况是50,但可以加标到500,那么您最初需要分配50,然后每隔realloc
分配一倍或三倍(或10倍),这样您就可以达到500 in 1- 3 realloc
s,但任何进一步的realloc
都不太可能且不常见。所以这主要取决于你的使用模式。