当前位置: 首页 > 面试题库 >

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

路裕
2023-03-14
问题内容

static vs dynamic当您知道Con上对象/项目的确切数量时,我非常想知道哪种内存分配方法对性能(例如,运行时间)有利,这对性能有好处Linux。少量对象(少量内存)和大量对象(大量内存)的成本。

e.g., type A[N]type *A = malloc(sizeof(type) * N)

请告诉我。谢谢。

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


问题答案:

静态分配将更快。静态分配可以在全局范围和堆栈上进行。

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

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

动态内存必须从堆中分配,即使在最好的情况下,大多数分配所花费的时间也要比每个分配的线性扩展更多,例如n log n time或其他。

实际上,动态分配也将比静态分配慢许多倍。

@update:正如以下注释中所指出的:栈分配在技术上不是静态分配(但它们是OP的问题中使用的语法形式的分配)。

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

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

也确实有些快速分配器以内存效率换取分配速度。在这些情况下,静态仍然“更好”,因为在分配精确大小的块时,静态和堆栈分配分别没有时间和恒html" target="_blank">定时间。

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



 类似资料:
  • 当您知道中对象/项的确切数量时,我很想知道内存分配的首选方法是什么对性能(例如,运行时间)有好处Linux。少量对象(少量内存)和大量对象(大量内存)的成本。 例如,类型A【N】vs 请让我知道。非常感谢。 注意:我们可以对此进行基准测试,并可能知道答案。但我想知道解释这两种分配方法之间性能差异的概念。

  • 在V9.0.0版本之前为下列对象分配内存采用动态的方式,在之后的版本才允许应用程序开发者自己静态的分配内存; 任务 软件定时器 队列 事件组 二值信号量 计数信号量 递归信号量 互斥量 当然,具体使用静态分配还是动态分配由开发者自己决定。 动态分配 动态分配的好处在于使用灵活简单、同时潜在的可以降低内存占用。 更少的函数参数 内存分配使用RTOS提供的API自动分配 应用程序开发者不需要自己去考虑

  • 动态内存分配 我们之前在 C/C++ 语言等中使用过 malloc/free 等动态内存分配方法,与在编译期就已完成的静态内存分配相比,动态内存分配可以根据程序运行时状态修改内存申请的时机及大小,显得更为灵活,但是这是需要操作系统的支持的,同时也会带来一些开销。 我们的内核中也需要动态内存分配。典型的应用场景有: Box<T> ,你可以理解为它和 malloc 有着相同的功能; 引用计数 Rc<T

  • 一个常见的编程习惯是在空闲存储区中动态分配内存(可能是对象),将该内存的地址赋给一个指针,使用这个指针操作内存,并在该内存不再需要时用delete释放内存。如果内存分配之后和执行delete语句之前发生异常,则可能发生内存泄漏。ANSI/ISO C++草案标准提供 <memory> 头文件中的auto_ptr类模板,可以解决这个问题。 auto_ptr 类对象维护动态分配内存的指针。当auto_p

  • 本文向大家介绍C语言 动态内存分配详解,包括了C语言 动态内存分配详解的使用技巧和注意事项,需要的朋友参考一下 C语言 动态内存分配详解 动态内存分配涉及到堆栈的概念:堆栈是两种数据结构。堆栈都是数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。 栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 堆(操作系

  • 本文向大家介绍详解C++ 动态内存分配与命名空间,包括了详解C++ 动态内存分配与命名空间的使用技巧和注意事项,需要的朋友参考一下 1、C++中的动态内存分配 通过new关键字进行动态内存申请 C++中的动态内存申请时基于类型进行的 delete关键用于内存释放 C语言其实是不支持动态内存分配的,是通过malloc库函数来实现的,可能有一些硬件根本不支持malloc;而C++ new是一个关键字,