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

时间:2021-01-09 01:36:45

标签: c

我今天一直在练习 C,我想到了一些东西。每当运行 C 代码时,它是否将执行所需的所有文件加载到内存中?比如,main.c 文件及其头文件是否被复制到内存中?如果你有一个完整的 C 程序,占用 1 GB 或更大的空间,会发生什么?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

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

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

此外,包含在 C 源文件顶部的 *.h 头文件实际上并不是“导入”依赖项(例如 userequireimport 在其他语言中)。 #include 语句在这里只是为了在给定的点插入文件的内容,但这些文件通常只包含函数原型、变量声明和一些预编译器#define 子句,它们构成了外部资源的 API 稍后链接到您的程序。

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

相关问题