【发布时间】:2012-07-03 15:17:55
【问题描述】:
我一直坚信分配大块连续内存不是一个好习惯。很明显,如果内存碎片发挥作用,您可能会遇到麻烦,在大多数情况下不能确定排除(尤其是在设计为服务等的大型项目中)。
最近我遇到ITK 图像处理库并意识到,它们(实际上)总是将图像数据(甚至是 3D - 这可能是巨大的)分配为一个连续的块。有人告诉我这应该不是问题,至少对于 64 位进程而言。但是,我看不出 64 位和 32 位进程之间的系统差异,除了由于更大的虚拟地址空间可能会延迟发生内存问题。
言归正传:我想知道在处理大量数据时有什么好的做法:简单地将其分配为一个大块,还是将其拆分为更小的块进行分配?
由于问题当然是特定于系统的,我想将其限制为本机(非托管,无 CLR)C++,尤其是在 Windows 下。但是,如果可能的话,我也会对任何更通用的 cmets 感兴趣。
【问题讨论】:
-
即使是唯一的区别,延迟 2^32 倍也是非常重要的。这意味着一个长时间运行的进程之前在 1 分钟后遇到内存碎片问题,现在在 8000 年后遇到问题。不希望得到关于它的所有 Y2K,直到 8000 年正常运行时间才会出现的问题不是问题。或者至少不是我的问题。
-
地址大小加倍不会使空间增加一倍,而是空间平方。所以问题会在 64 位系统上很多出现。
-
求助于编写自己的分配器的人这样做有两个原因:1. 他们被误导了,2. 这是经过大量分析后的绝对最后手段,并且彻底了解了分配器的局限性。默认内存管理系统。那么你属于哪一类呢?我的意思是,使用系统内存管理器,除非这被证明是瓶颈。
-
@Nim 根据您的工作,您管理内存的方式可能会产生重大影响。将图像数据分配到一个连续的块中,而不是将其分段,简化了访问并提高了局部性,这两者都可以显着提高性能。
-
@Nim 您不必编写自己的经理。 IIUC,图像数据在逻辑上是一个大(结构化?)块。在单个
new中分配它可能比将它分成块更容易。 (在我编写自己的内存管理器之前,我会在网上四处寻找malloc的替代实现。)
标签: c++ memory-management