我现在正在学习 C,并试图弄清楚 C 的内存管理是如何工作的。如果我错了,请纠正我,但据我所知:
静态内存分配 - 这发生在编译时。编译器分配静态内存所需的必要内存。
静态内存释放 - 当 block /函数完成运行(对于局部变量)或整个程序完成执行(对于全局变量)时,内存会自动释放。
动态内存分配 - 内存在运行时分配,因为此时输入的大小未知。
动态内存释放 - 执行 free() 时释放内存。
这对吗?我错过了什么吗?
最佳答案
C语言中有3种不同的存储期限:
- static:变量的生命周期就是程序的生命周期。它在加载时分配(仅在编译时定义),并且仅在操作系统卸载程序时释放。静态变量是在任何函数外部声明的变量,以及具有
static
修饰符的局部变量(在函数或 block 中声明) - automatic:自动变量在 block (或函数)内声明,没有存储修饰符。它们的生命周期从 block 的开头开始,到 block 的末尾结束。它们通常在 block 的开头分配并在其末尾释放,但由于 if 规则,优化编译器可以更快地分配它们并稍后释放它们,例如,如果 block 位于循环内。
- 动态:它们通过
malloc
手动分配,并且只能通过free
释放
常见的实现使用系统堆栈来存储自动变量,使用内存池(询问操作系统何时需要更多内存)来存储动态变量,但这是一个实现细节
当使用多线程时,还有第四种存储时长:线程存储时长。这些变量是使用_Thread_local
存储类修饰符声明的。它们的生命周期就是线程的持续时间,每个线程都有自己的副本。
对于常见的实现,它们的管理方式与静态变量相同:它们在创建线程时由操作系统分配,并在线程结束时回收(仍然由操作系统)。
关于您的措辞的一些评论:
Static memory allocation - this happens during compile time.
请注意,编译时间和加载时间是不同的。在构建时仅创建一个文件,并且仅在运行时由系统分配内存
Static memory deallocation - the memory is deallocated automatically when the block/function is finished running (for local variables)...
范围(本地与全局)和存储持续时间之间存在混淆。函数可以包含静态变量,这就是使用 static
关键字的原因之一
Dynamic memory allocation - the memory is allocated during run-time because the size of the input is unknown at this time
这是程序员使用动态内存的一个可能原因,但可能还有其他原因,例如因为这样代码会更干净。特别是,当您想用 C 语言模拟面向对象编程时,动态内存是一个很好的工具。
关于c - C 中的静态和动态内存何时分配和取消分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59677400/