0

对于序列化系统,我需要分配缓冲区来写入数据。所需的大小事先不知道,因此基本模式是malloc N字节并realloc在需要时使用。的大小N足以容纳大多数对象,因此很少进行重新分配。

这使我认为可能存在malloc比其他字节更容易满足的最佳初始字节数。我猜在靠近 的某个地方pagesize,但不一定完全malloc需要一些房间来做家务。

现在,我确信这是一个无用的优化,如果它真的很重要,我可以使用一个池,但我很好奇;我不能成为第一个认为给我最容易分配的字节块作为开始的程序员。有没有办法确定这一点?

任何专门适用于现代 GCC/G++ 和/或 linux 的答案都将被接受。

4

3 回答 3

2

通过阅读wiki 页面,您的答案似乎会因您使用的 malloc 的实现和操作系统而有很大差异。阅读 OpenBSD 的 malloc 上的内容特别有趣。听起来您也想查看 mmap,但猜测我会说分配默认页面大小(4096?)将被优化。

于 2011-04-07T01:16:45.963 回答
1

我对你的建议是找到一个合适的 malloc/realloc/free 源代码,这样你就可以在同一个源模块(并使用相同的内存结构)中实现你自己的“malloc_first”,它只是分配并返回第一个可用块大于或等于传递的 minimum_bytes 参数。如果通过 0,您将获得第一个区块周期。

一个适当的声明可以是

void *malloc_first (size_t minimum_bytes, size_t *actual_bytes);

我不知道这样的事业有多可行。我建议您尝试使用所有源代码都可用的 Linux。

于 2011-04-25T15:29:43.097 回答
-1

在类似情况下完成的方式是首先malloc分配一些重要但不太大的块,这将适合大多数情况(如您所述),并且每次后续realloc调用都将请求的大小加倍。

所以,如果一开始分配 100,下次分配realloc200,然后分配 400、800,以此类推。这样,每次执行此操作后,后续重新分配的机会就会降低。

如果记忆对我有用,那就是std::vector行为方式。

编辑后

最佳的初始分配大小将在一侧覆盖您的大多数情况,但在另一侧不会太浪费。如果您的平均病例数为 50,但可能飙升至 500,则您将希望最初分配 50,然后每隔一倍或三倍(或乘以 10),realloc以便您可以在 1-3realloc秒内达到 500,但任何进一步realloc的 s 不太可能且不常见。所以这基本上取决于你的使用模式。

于 2011-04-07T01:13:37.637 回答