静态内存分配和dynamic内存分配之间的区别
我想知道静态内存分配和dynamic内存分配有什么区别?
你能解释一下这个例子吗?
有三种types的分配 – 静态,自动和dynamic。
静态分配意味着当程序启动时,variables的内存被分配。 程序创build时大小是固定的。 它适用于全局variables,文件范围variables和限定在函数内的static
variables。
自动内存分配发生在函数内部定义的(非静态)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
关键字时,事情变得更有趣。 当一个extern
variables被定义时 ,编译器为它分配内存。 当声明一个extern
variables时,编译器要求在其他地方定义该variables。 未能声明/定义extern
variables将导致链接问题,而未能声明/定义static
variables将导致编译问题。
在文件范围内,static关键字是可选的(在函数之外):
int a = 32;
但不在函数范围内(在一个函数内):
static int a = 32;
从技术上讲, extern
和static
是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存储器的例子。