【发布时间】:2013-09-08 12:30:59
【问题描述】:
我的意思是 - 分配小内存块比分配大内存块更快吗?即:
int * dummy = new int; // A
int * dummy2 = new int[2]; // A
int * dummy3 = new int[1000000]; // B
VeryVeryBigStruct * dummy4 = new VeryVeryBigStruct; // B
(A) 是小分配,(B) 是大分配。
我知道我可以编写一个简单的程序并自己测试它,但我实际上尝试过,甚至QueryPerformanceCounter() 也返回了0 单个小分配的时间(这有点令人惊讶,因为所有分配都应该如此缓慢。此外, 1 台计算机上的 1 次测试几乎不可靠,所以我想听听你对此事的了解。
另外,我想知道 10 次分配 N 字节是否比分配 1 次 10 * N 字节快/慢(我会说它应该更慢,但谁知道呢)。
【问题讨论】:
-
请注意,任何答案都必须对内存分配的内部进行一些重要的假设,这使得它们成为特定于实现的,即使 如果这些假设对于几乎所有实现都是正确的的
new/new[]/malloc。内存分配器的 /design 空间是巨大的,对于任何可能的答案,我都可以很容易地构思出一个答案不适用的内存分配器——尽管它们中的大多数对于实际代码来说都很糟糕。 -
我想知道您是否在测试中使用了优化选项。
-
底层内存管理器通常一次分配大块内存(例如,类 Unix 系统上的 页面,大小可能约为 4kB)。少量分配可能适合现有页面,因此速度很快。
-
Windows 上的分配速度非常快,它们只是分配虚拟内存。它不需要任何费用。在您真正访问内存之前,您不会开始付费。此时,您将引发页面错误以将内存映射到 RAM。
-
@HansPassant 另一方面,必须设置页表和虚拟机结构,对吗?您保留的页面越多,它们可能越贵。
标签: c++ performance memory-management