静态内存分配和dynamic内存分配之间的区别

我想知道静态内存分配和dynamic内存分配有什么区别?

你能解释一下这个例子吗?

有三种types的分配 – 静态,自动和dynamic。

静态分配意味着当程序启动时,variables的内存被分配。 程序创build时大小是固定的。 它适用于全局variables,文件范围variables和限定在函数内的staticvariables。

自动内存分配发生在函数内部定义的(非静态)variables上,通常存储在堆栈中 (尽pipeC标准没有要求使用堆栈)。 您不必使用它们来预留额外的内存,但是另一方面也限制了这个内存的使用寿命。 例如:函数中的自动variables只有在函数完成时才存在。

 void func() { int i; /* `i` only exists during `func` */ } 

dynamic内存分配有点不同。 您现在可以控制这些内存位置的确切大小和使用期限。 如果你没有释放它,你会遇到内存泄漏,这可能会导致你的应用程序崩溃,因为在某个时间点,系统不能分配更多的内存。

 int* func() { int* mem = malloc(1024); return mem; } int* mem = func(); /* still accessible */ 

在上面的例子中,即使函数终止,分配的内存仍然有效并且可以访问。 当你完成记忆时,你必须释放它:

 free(mem); 

这是一个标准的面试问题:

dynamic内存分配

在运行时使用calloc()malloc()和朋友分配内存。 它有时也被称为“堆”内存,尽pipe它与堆数据结构ref无关。

 int * a = malloc(sizeof(int)); 

堆内存是持久的,直到free()被调用。 换句话说,你控制variables的生命周期。

自动内存分配

这就是所谓的“栈”内存,当你进入一个新的范围(通常是当一个新的函数被压入调用栈)时被分配。 一旦移出作用域,自动内存地址的值就不确定,并且访问它们是错误的 。

 int a = 43; 

请注意,范围不一定意味着function。 范围可以嵌套在一个函数中,并且该variables只在声明的块内位于范围内。 还要注意,这个内存分配的地方没有指定。 (在一个合理的系统上,它将在堆栈中,或者注册以进行优化)

静态内存分配

在编译时分配,静态内存中variables的生命周期是程序的生命周期 。

在C中,可以使用static关键字来分配静态内存。 范围只是编译单位。

当考虑到extern关键字时,事情变得更有趣。 当一个externvariables被定义时 ,编译器为它分配内存。 当声明一个externvariables时,编译器要求在其他地方定义该variables。 未能声明/定义externvariables将导致链接问题,而未能声明/定义staticvariables将导致编译问题。

在文件范围内,static关键字是可选的(在函数之外):

 int a = 32; 

但不在函数范围内(在一个函数内):

 static int a = 32; 

从技术上讲, externstatic是C中两个独立的variables类。

 extern int a; /* Declaration */ int a; /* Definition */ 

注册内存

最后一个内存类是“注册”variables。 正如所料,寄存器variables应该分配在一个CPU的寄存器中,但是这个决定实际上留给了编译器。 您不能通过使用address-of来将一个寄存器variables转换成一个引用。

 register int meaning = 42; printf("%p\n",&meaning); /* this is wrong and will fail at compile time. */ 

大多数现代编译器比你更聪明的select哪些variables应该放在寄存器:)

参考文献:

  • libc手册
  • K&R的C编程语言 ,附录A,第4.1节“存储类”。 ( PDF )
  • C11标准 ,第5.1.2和6.2.2.3节
  • 维基百科在静态内存分配 , dynamic内存分配和自动内存分配方面也有很好的页面
  • 维基百科上的Cdynamic内存分配页面
  • 这个内存pipe理参考有关dynamic分配器的底层实现的更多细节。

dynamic内存分配 – 内存在运行时在堆中分配。 当内存的数量(大小)是可变的并且仅在运行时间内被知道时使用。 dynamic分配是通过使用某些函数来实现的,如使用C中的malloc(),calloc(),realloc(),free和C ++中的“new”,“delete”。

静态内存分配 – 在编译时以堆栈或其他数据段分配的内存。 当内存的数量(大小)是静态/常量并且在编译期间已知时使用。

静态内存分配:编译器为声明的variables分配所需的内存空间。通过使用操作符的地址,获得保留地址,并且可以将该地址分配给指针variables。由于大多数声明的variables具有静态内存,因此将指针值分配给指针variables的方式称为静态内存分配。 内存在编译期间分配。

dynamic内存分配:它使用malloc()或calloc()等函数dynamic获取内存。如果这些函数用于dynamic获取内存,并且这些函数返回的值被赋值给指针variables,则这种赋值被称为dynamic内存allocation.memory在运行时间被确定。

静态记忆分配dynamic记忆分配的区别

在程序执行开始之前分配内存(编译期间)。
内存在程序执行期间分配。

执行期间不执行内存分配或释放操作。
内存绑定在执行期间被build立和销毁。

variables保持永久分配。
仅在程序单元处于活动状态时分配。

使用堆栈和堆实现。
使用数据段来实现。

访问variables需要指针。
不需要dynamic分配的指针。

比dynamic执行更快。
比静态执行速度慢。

需要更多的内存空间。
所需的内存空间较less。

静态内存分配。 内存分配将堆栈。

 int a[10]; 

dynamic内存分配。 内存分配将在堆中。

 int *a = malloc(sizeof(int) * 10); 

而后者应该是免费的,因为在C中没有垃圾收集器(GC)。

 free(a); 

静态内存分配是在编译期间执行pf程序之前分配的内存。 在运行时程序执行期间,dynamic内存分配是分配的内存。

静态存储器:静态存储器器件是半导体存储器,只要施加电源,存储的数据将永久保存,而不需要定期重写或刷新数据到存储器中。 这个存储的基本元素是一个触发器或一个门。 SRAM,穿孔卡和磁带是静态存储器的例子。

静态存储器:静态存储器器件是半导体存储器,只要施加电源,存储的数据将永久保存,而不需要定期重写或刷新数据到存储器中。 这个存储的基本元素是一个触发器或一个门。 SRAM,穿孔卡和磁带是静态存储器的例子。

dynamic存储器:dynamic存储器器件是半导体存储器,其中存储的数据将不会永久存储,即使在施加了电源的情况下,除非数据被周期性地重写到存储器中。 数据存储为电容器上的电荷。 电容器上的电荷必须定期刷新,以防止其泄漏。 DRAM和电荷耦合器件(CCD)是dynamic存储器的例子。