C程序是否将所有内容加载到内存中?

C程序是否将所有内容加载到内存中?,c,C,我今天一直在练习C,我突然想到了一件事。无论何时运行C代码,它都会将执行所需的所有文件加载到内存中吗?比如,主.c文件及其头文件是否被复制到内存中?如果您有一个完整的C程序,它占用1 GB或更大的空间,会发生什么情况?C程序首先被编译成二进制可执行文件,这样头文件、源文件等就不再存在了。。。除非您使用调试信息S-g标志编译二进制文件 这是一个巨大的话题。通常,可执行文件被映射到所谓的虚拟内存中,虚拟内存允许通过分页处理比计算机内存中可用空间更多的空间。当您试图访问尚未加载的代码段时,它将创建一个

我今天一直在练习C,我突然想到了一件事。无论何时运行C代码,它都会将执行所需的所有文件加载到内存中吗?比如,主.c文件及其头文件是否被复制到内存中?如果您有一个完整的C程序,它占用1 GB或更大的空间,会发生什么情况?

C程序首先被编译成二进制可执行文件,这样头文件、源文件等就不再存在了。。。除非您使用调试信息S-g标志编译二进制文件

这是一个巨大的话题。通常,可执行文件被映射到所谓的虚拟内存中,虚拟内存允许通过分页处理比计算机内存中可用空间更多的空间。当您试图访问尚未加载的代码段时,它将创建一个页面错误,操作系统将获取丢失的内容。编译器通常会对函数进行重新排序,以避免从随机内存位置执行代码,因此在大多数情况下,您只能执行二进制文件的一小部分


如果您查看特定域(如HPC或嵌入式设备),加载策略可能会有所不同。

C程序首先编译为二进制可执行文件,因此此时头文件、源文件等不再存在。。。除非您使用调试信息S-g标志编译二进制文件

这是一个巨大的话题。通常,可执行文件被映射到所谓的虚拟内存中,虚拟内存允许通过分页处理比计算机内存中可用空间更多的空间。当您试图访问尚未加载的代码段时,它将创建一个页面错误,操作系统将获取丢失的内容。编译器通常会对函数进行重新排序,以避免从随机内存位置执行代码,因此在大多数情况下,您只能执行二进制文件的一小部分


如果您查看特定的域,例如HPC或嵌入式设备,加载策略可能会有所不同。

C不是解释的,而是编译语言

这意味着原始*.c源文件永远不会在执行时加载。相反,编译器将对其进行一次处理,以生成包含机器语言的可执行文件

因此,源文件的大小并不直接重要。如果它包含许多不同的用例,那么它可能会非常大,然后生成一个很小的可执行文件,因为在编译时只会选择适用的用例。然而,在大多数情况下,可执行文件的大小仍然与其源文件相关,但这并不一定意味着这将导致巨大的后果

此外,C源文件顶部包含的*.h头文件实际上并不是«导入»依赖关系,如在其他语言中使用、要求或导入。include语句仅用于在给定点插入文件的内容,但这些文件通常只包含函数原型、变量声明和一些预编译器define子句,它们构成了稍后链接到程序的外部资源的API


当您在同一个项目中有多个*.c文件时,这些外部资源通常是其他对象模块,并且您不需要每次从头开始重新编译它们(静态库或动态库)。后面这些是Windows下的DLL文件和Unix下的*.so文件。在这种情况下,当您运行程序时,操作系统将自动加载所需的库。

C不是解释语言,而是编译语言

这意味着原始*.c源文件永远不会在执行时加载。相反,编译器将对其进行一次处理,以生成包含机器语言的可执行文件

因此,源文件的大小并不直接重要。如果它包含许多不同的用例,那么它可能会非常大,然后生成一个很小的可执行文件,因为在编译时只会选择适用的用例。然而,在大多数情况下,可执行文件的大小仍然与其源文件相关,但这并不一定意味着这将导致巨大的后果

此外,C源文件顶部包含的*.h头文件实际上并不是«导入»依赖关系,如在其他语言中使用、要求或导入。include语句仅用于在给定点插入文件的内容,但这些文件通常只包含函数原型、变量声明和一些预编译器define子句,它们构成了稍后链接到程序的外部资源的API

当您在同一个项目中有多个*.c文件时,这些外部资源通常是其他对象模块,并且您不需要每次从头开始重新编译它们(静态库或动态库)。后面这些是Windows下的DLL文件和Unix下的*.so文件。在这种情况下,当您运行程序时,操作系统将自动加载所需的库。


完成编译器后,将不会涉及。运行的只是可执行程序,是否完全加载取决于底层系统。e、 g.微软Windows部分是用C编写的,但我的电脑上没有任何C文件/标题,微软对这些文件/标题严加保密,因为它们包含商业秘密;我所拥有的只是.exes、.sys文件等。它可以按需分页、闪存到设备的EEPROM中进行嵌入、整体加载等。问题太广泛了。底线是没有一个答案,是的,有些情况下整个程序都被加载了,有些情况下整个程序都没有同时加载到内存中。这回答了你的问题吗?编译完成后,不涉及.c文件。运行的只是可执行程序,是否完全加载取决于底层系统。e、 g.微软Windows部分是用C编写的,但我的电脑上没有任何C文件/标题,微软对这些文件/标题严加保密,因为它们包含商业秘密;我所拥有的只是.exes、.sys文件等。它可以按需分页、闪存到设备的EEPROM中进行嵌入、整体加载等。问题太广泛了。底线是没有一个答案,是的,有些情况下整个程序都被加载了,有些情况下整个程序都没有同时加载到内存中。这回答了你的问题吗?这对于消费者计算设置中常用的某些系统是正确的。值得注意的是,一般来说,C语言并不适用,例如,微控制器可以将整个程序存储在连接到指令总线的内存中,而无需任何分页或交换;一台小型计算机可能有运行时驱动的分页,但没有交换或隐式操作系统辅助的按需分页是的,另外,如果有,它还避免了捕获到内核的开销。这个问题所涉及的不仅仅是思考,谢谢大家。我一时忘了C是一种编译语言。我调查了@supersormer发给我的相关问题,这回答了我的问题。据我所知,指令驻留在内存中,然后某些任务跳转到处理器的寄存器。当需要分配内存时,堆用于动态内存,而堆栈用于非动态内存。再次感谢您的澄清,这对于消费者计算设置中常用的一些系统是正确的。值得注意的是,一般来说,C语言并不适用,例如,微控制器可以将整个程序存储在连接到指令总线的内存中,而无需任何分页或交换;一台小型计算机可能有运行时驱动的分页,但没有交换或隐式操作系统辅助的按需分页是的,另外,如果有,它还避免了捕获到内核的开销。这个问题所涉及的不仅仅是思考,谢谢大家。我一时忘了C是一种编译语言。我调查了@supersormer发给我的相关问题,这回答了我的问题。据我所知,指令驻留在内存中,然后某些任务跳转到处理器的寄存器。当需要分配内存时,堆用于动态内存,而堆栈用于非动态内存。再次感谢您的澄清