static vs dynamic当您知道Con上对象/项目的确切数量时,我非常想知道哪种内存分配方法对性能(例如,运行时间)有利,这对性能有好处Linux。少量对象(少量内存)和大量对象(大量内存)的成本。
static vs dynamic
C
Linux
e.g., type A[N] 与 type *A = malloc(sizeof(type) * N)
e.g., type A[N]
type *A = malloc(sizeof(type) * N)
请告诉我。谢谢。
注意:我们可以对此进行基准测试,并且可能知道答案。但是我想知道解释这两种分配方法之间性能差异的概念。
静态分配将更快。静态分配可以在全局范围和堆栈上进行。
在全局范围内,静态分配的内存内置在二进制映像中。那就是所需内存的总大小,并且正在运行的二进制文件中该内存的位置在编译时进行计算。然后,在程序加载时,操作系统加载器将为所有全局静态数组分配足够的内存。我很确定,所有分配都会在固定时间内发生。(例如,更多的分配不会花费更多的时间)
在本地范围内,静态分配在堆栈上分配。这涉及简单地在堆栈上保留固定数量的字节,并且每次分配的时间都是固定的。堆栈空间非常有限。
动态内存必须从堆中分配,即使在最好的情况下,大多数分配所花费的时间也要比每个分配的线性扩展更多,例如n log n time或其他。
实际上,动态分配也将比静态分配慢许多倍。
@update:正如以下注释中所指出的:栈分配在技术上不是静态分配(但它们是OP的问题中使用的语法形式的分配)。
另外,当谈到“分配时间”时,我正在考虑管理内存的总时间(alloc和free)。
在某些动态分配器中,分配时间比释放时间快。
也确实有些快速分配器以内存效率换取分配速度。在这些情况下,静态仍然“更好”,因为在分配精确大小的块时,静态和堆栈分配分别没有时间和恒定时间。
动态分配器可以快速权衡显着的内存效率(例如,伙伴分配器向上舍入为两个大小的块的下一个幂,例如33k alloc将使用64k)