gpt4 book ai didi

C 中静态内存分配与动态内存分配的成本

转载 作者:IT王子 更新时间:2023-10-28 23:30:18 24 4
gpt4 key购买 nike

当您知道 中的对象/项目的确切数量时,我很想知道什么是内存分配的首选方法静态与动态 对性能(例如运行时间)有好处>CLinux 上。少量对象(少量内存)和大量对象(大量内存)的成本。

例如,type A[N] vs type *A = malloc(sizeof(type) * N)

请告诉我。谢谢。

注意:我们可以对此进行基准测试,并且可能知道答案。但我想知道解释这两种分配方法性能差异的概念。

最佳答案

静态分配会快得多。静态分配可以发生在全局范围和堆栈上。

在全局范围内,静态分配的内存被内置到二进制镜像中。这是所需内存的总大小,它在运行二进制文件中的位置是在编译时计算的。然后当程序加载时,操作系统加载器将为所有全局静态数组分配足够的内存。我很确定所有分配都会在恒定时间内发生。 (例如,更多的分配不会花费更多的时间)

在本地范围内,静态分配在堆栈上分配。这涉及简单地在堆栈上保留固定数量的字节,并且每次分配都在恒定时间内发生。堆栈空间非常有限。

动态内存必须从堆中分配,即使在最好的情况下,大多数分配所花费的时间也会随着每次分配而超过线性扩展,例如 n log n 时间或其他东西。

实际上,动态分配比静态分配慢很多倍。

@update:正如在下面的评论中指出的那样:堆栈分配在技术上不是静态分配(但它们是具有 OP 问题中使用的句法形式的分配)。

另外,当谈到“分配时间”时,我正在考虑管理内存的总时间(alloc 和 free)。

在某些动态分配器中,分配时间比释放时间快。

有些快速分配器以内存效率换取分配速度也是事实。在这些情况下,静态仍然“更好”,因为在分配精确大小的 block 时,静态和堆栈分配分别不是时间和恒定时间。

动态分配器快速权衡显着的内存效率(例如,伙伴分配器四舍五入到两个大小块的下一个幂,如 33k 分配器将使用 64k)

关于C 中静态内存分配与动态内存分配的成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30199744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com