在我的程序中,我创建了一个大的(大约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()调用。我就是要改变实现以分配更大的块。对我来说最简单的就是将所有东西都分配为一个大块。
现在我知道用户空间内存模型和实际物理内存之间至少存在一个级别的虚拟化,但是仍然存在获得如此大的“连续”内存块的问题吗?
答案 0 :(得分:1)
连续的虚拟并不意味着连续的物理。如果你的进程可以单独分配N个页面,它也可以在一次调用中分配它们(从一个调用中实际上从多个角度来看实际上更好)。在旧的32位体系结构中,虚拟内存地址空间的有限大小是一个问题,但在64位上不再是问题。此外,即使是32位,如果你可以单独分配10MM,你应该能够在一次通话中分配相同的10MM。
话虽这么说,您可能需要仔细重新审视您的设计并重新考虑为什么您需要在内存中分配10MM元素。