【问题标题】:In C is a function loaded into memory when it is first called or when the program starts? And can it be unloaded from memory?在 C 中,函数是在第一次调用或程序启动时加载到内存中的吗?它可以从内存中卸载吗?
【发布时间】:2014-01-09 00:18:54
【问题描述】:

例如:

如果我有一个名为void Does_Stuff(int arg) 的函数并在主函数中调用它,那么 void Does_Stuff 是否仅在首次调用时才加载到内存中?还是在程序初始化时加载到内存中?

在main中调用Does_Stuff后,我可以手动从内存中卸载它吗?

作为参考,我正在运行的操作系统是 Windows 7,并且我正在使用 MinGW 进行编译。

【问题讨论】:

  • 这取决于操作系统。
  • 按需分页虚拟内存操作系统的工作是在调​​用时将代码加载到 RAM 中。你没有做任何帮助,它是自动的。当你使用 [c] 标签时,你不应该谈论这些细节。尤其是当您不提及执行代码的操作系统时。
  • 是的,这是我们喜欢隐藏的肮脏小秘密之一。
  • @HansPassant:问也无妨。

标签: c function memory


【解决方案1】:

简单来说(带有通常的依赖于各种平台的警告),您的普通全局 C 函数的代码在程序加载时“加载到内存中”。您不能要求将其“卸载”。

也就是说,正如 Hans 在评论中提到的那样,操作系统在较低级别负责哪些内容足够重要以存在于物理 RAM 中,并且可以选择“分页out" 不经常使用的内存。这不是每个功能,并且不了解您的代码结构。因此,从这个意义上说,函数的代码可能发生在实际 RAM 中存在或不存在的不同时间。但这是低于应用程序执行的级别,其中 C 函数始终“存在且可用”。

【讨论】:

    【解决方案2】:

    您的代码调用的 DLL 可能会随着您的调用而出现和消失。但是你的主程序 *.exe 应该在开始时全押。

    【讨论】:

      【解决方案3】:

      虽然具体细节取决于编译器、链接器、平台和实现,但通常情况下,程序中的所有函数都由操作系统的可执行加载器加载到内存中,并一直驻留在内存中,直到程序终止。该内存通常也是静态的(尽管某些程序可以并且确实会重写自身的一部分),因此它是只读的。

      现在,每次调用函数并传递参数时,该参数都会添加到内存中(原则上与函数所在的内存不同),并在函数调用返回时再次删除(这是简化版本) .

      【讨论】:

        【解决方案4】:

        在某些平台(例如,DOS)上,您的整个程序在运行时驻留在内存中。在其他平台上,它可能会在不运行时被换出内存(例如,古老的 UNIX 版本)。在大多数平台上,您的程序通常被分成 4 KB 的页面。当您访问尚未加载的页面时,操作系统会透明地为您生成所需的页面(即您根本没有注意到)。如果操作系统内存不足,它可能会换出单个页面。你根本无法从程序内部控制它。

        如果您希望能够控制内存中的内容和不存在的内容,您可能需要了解内存映射和 mmap 系统调用。

        【讨论】:

        • 从前,有一种技术叫做overlaying。覆盖是虚拟内存的一种基本形式,至少从 DOS 时代就开始使用。覆盖文件,通常以.ovl 扩展名命名,包含可以交换进出主内存的代码或数据块,有时是手动的,也可以探索这种机制来实现库和其他形式的动态链接。在那些日子里,一个函数可以被显式加载和卸载,就像现代动态库一样。
        猜你喜欢
        • 1970-01-01
        • 2015-07-12
        • 2016-10-03
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 2017-10-06
        • 1970-01-01
        • 2015-07-02
        相关资源
        最近更新 更多