在C语言中,函数是在第一次调用时还是在程序启动时加载到内存中的?它可以从内存中卸载吗?

在C语言中,函数是在第一次调用时还是在程序启动时加载到内存中的?它可以从内存中卸载吗?,c,function,memory,C,Function,Memory,例如: 如果我有一个名为void Does_Stuff(int arg)的函数,并在主函数中调用它,那么void Does_Stuff是否仅在第一次调用时加载到内存中?还是在程序初始化期间加载到内存中 在调用main中的Does_Stuff之后,我可以手动从内存中卸载它吗 作为参考,我运行的操作系统是Windows 7,我使用MinGW进行编译。尽管具体细节取决于编译器、链接器、平台和实现,但通常情况下,程序中的所有函数都由操作系统的可执行加载程序加载到内存中,并驻留在内存中,直到程序终止。这种

例如:

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

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


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

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

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

简单地说(通常取决于各种平台的注意事项),在加载程序时,常规全局C函数的代码“加载到内存中”。您不能请求将其“卸载”。


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

可以想象,代码调用的DLL可以随调用而来随调用而去。但是主程序*.exe应该在启动时全部进入。

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


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

这取决于操作系统。当您调用代码时,按需分页虚拟内存操作系统的任务是将代码加载到RAM中。你不做任何帮助,这是automagic。当您使用[c]标记时,不应该谈论这些细节。尤其是当你不提及执行代码的操作系统时。是的,这是我们喜欢掩盖的肮脏的小秘密之一。@HansPassant:不问也无妨。很久以前,有一种技术叫做叠加。叠加是虚拟内存的一种基本形式,至少在DOS时代就开始使用了。覆盖文件(通常以
.ovl
扩展名命名)包含代码块或数据块,这些代码块或数据块可以在主内存中交换,有时可以手动交换,也可以探索这种机制来实现库和其他形式的动态链接。在那些日子里,可以显式地加载和卸载函数,这与现代动态库的加载和卸载方式非常相似。