在什么情况下静态分配比动态分配更好?

rpa*_*abi 5 memory memory-management

我正在做一些制作Xara Xtreme的决定,这是一个开源的SVG图形应用程序.他们的内存管理决策对我来说非常有趣,因为我天真地认为按需动态分配是编写面向对象应用程序的方式.

文档中的解释是

静态分配如何才能有效?

如果您习惯于大型动态数据结构,这对您来说可能很奇怪.首先,我们所有的对象(以及分配大小)都比(例如Impression)程序中的每个动态区域分配小得多(平均).这意味着虽然内存中可能存在许多漏洞,但它们很小.此外,我们在内存中分配的对象要多得多,因此这些漏洞很快就会被填满.此外,虚拟内存管理器将释放任何不包含分配的内存页面,并将此内存返回给操作系统,以便可以再次使用它(由我们或其他任务).

每当我们以这种方式分配内存时,我们都无需移动任何内存.这证明了ArtWorks的一个瓶颈,它也同时使用了许多小的分配.更多

简而言之,存在大量小对象和防止内存移动的需要是选择静态分配的原因.我对上述原因并不清楚.

虽然这谈到静态分配,但我从粗略看一下代码看到的是,在应用程序启动时动态分配内存块并保持活动直到应用程序结束,大致模拟静态分配.

你能解释静态分配在什么情况下比按需动态分配更好,以便将其视为严肃应用中的主要分配方式?

TMN*_*TMN 2

它更快,因为您避免了调用系统例程来管理存储的开销。 malloc()维护一个堆,因此每个请求都需要扫描适当大小的块,可能会调整块的大小,更新块列表以将此块标记为已使用,等等。如果您分配很多小对象,则此开销可能会过多的。通过静态分配,您可以创建一个分配池并仅维护一个简单的位图来显示哪些区域正在使用。这假设每个对象的大小相同,因此您通常为每种对象类型创建一个池。