0

在我的程序中,我创建了一个大型(约 1000 万个元素)对象列表,其中每个对象大约 500 字节大。目前的分配是这样的:

const int N = 10000000;
object_type ** list = malloc( N * sizeof * list );
for (int i=0; i < N; i++)
    list[i] = malloc( sizeof * list[i]);

这工作正常 - 但我发现,由于大量的小分配,运行时间的很大一部分用于 malloc() 和随后的 free() 调用。因此,我将更改实现以分配更大的块。对我来说最简单的方法是将所有内容分配为一大块。

现在我知道在用户空间内存模型和实际物理内存之间至少有一个虚拟化级别,但是仍然存在获得如此大的“连续”内存块时遇到问题的风险吗?

4

1 回答 1

1

连续的虚拟并不意味着连续的物理。如果您的进程可以单独分配 N 个页面,那么它也可以在一次调用中将它们全部分配(从许多角度来看,一次调用实际上会更好)。在旧的 32 位架构上,虚拟内存地址空间的有限大小是一个问题,但在 64 位上不再是问题。此外,即使在 32 位上,如果您可以单独分配 10MM,您应该能够在一次调用中分配相同的 10MM。

话虽如此,您可能需要仔细重新审视您的设计并重新考虑为什么需要在内存中分配 10MM 元素。

于 2012-09-06T14:32:29.353 回答