在过去,当我处理长时间运行的C++守护进程时,我不得不处理堆碎片问题.保持我的大量分配池的技巧是必要的,以防止耗尽连续的堆空间.
这仍然是64位地址空间的问题吗?Perf对我来说不是一个问题,所以我宁愿简化我的代码而不再处理像缓冲池这样的事情.有没有人有关于这个问题的经验或故事?我正在使用Linux,但我想很多相同的问题都适用于Windows.
这仍然是64位地址空间的问题吗?
不,这还不是问题.
你是正确的,它是32位系统上的一个问题,但它不再是64位系统的问题.
64位系统上的虚拟地址空间非常大(目前x86_64处理器上的时间为2 ^ 48字节,并且随着新的x86_64处理器问世,设置逐渐增加到2 ^ 64),连续的虚拟地址空间不足由于碎片几乎是不可能的(除了一些非常人为的极端情况).
(由于64是"仅"双32的事实导致直觉的常见错误,这导致人们认为64位地址空间大约是32位地址空间的两倍.实际上是一个完整的64位地址空间是32位地址空间的40亿倍.)
换句话说,如果你的32位守护进程花了一周的时间来分段到一个无法分配x字节块的阶段,那么至少需要一千年时间来分割今天的x86_64处理器48位地址空间,以及将未来计划的完整64位地址空间分割需要8000万年.