C程序需要多少内存

时间:2014-12-10 11:17:58

标签: c memory assembly memory-management

我正在开发内存数据库作为侧面项目,应该是轻量级的。自从上学以来,我没有在C上发表演讲,而且我对计算机架构的了解有限......

我想知道如何准确计算我的程序将占用多少内存以及从哪种内存(RAM,寄存器......)。 最明显的是我通过malloc分配的所有内容。对不起,如果以下问题有点随机......

  1. 全局变量将存储在RAM中?关键字static(限制范围)是否会影响任何内容?
  2. 是否所有全局变量都是同时分配的,还是可以在第一次访问时进行延迟分配?
  3. 可执行文件是否已加载到内存中? 1MB的可执行文件是否需要1MB才能执行?
  4. 这个主题很大,所以请不要犹豫,把我指向一本书或一个网站。我想这不仅仅是关于C,而是关于计算机体系结构,汇编代码等等。

3 个答案:

答案 0 :(得分:3)

我假设是典型的计算平台,而不是嵌入式系统。

  

全局变量将存储在RAM中?关键字static(限制范围)会影响什么吗?

仅当操作系统认为最适合RAM时,全局变量才会存储在RAM中。范围没有效果。

  

是否所有全局变量都是同时分配的,还是在第一次访问时可以延迟分配?

这取决于“分配”的含义。通常,虚拟内存(地址空间)一次性分配,但物理内存(RAM)根据需要进行分配。

  

可执行文件是否已加载到内存中? 1MB的可执行文件是否需要1MB才能执行?

在程序启动时映射到内存。它实际上是根据需要加载到物理内存中,并在操作系统认为合适的情况下从物理内存中逐出。

我强烈怀疑你正在寻找非常复杂问题的简单答案。

答案 1 :(得分:1)

  1. 是的,但这并不代表他们在任何指定时间点都已映射
  2. 根据你的意思,他们不能懒得分配。它们都将映射到虚拟地址,但如果程序永远不会访问变量,操作系统可能永远不需要将这些地址映射到实际的物理RAM。
  3. 这取决于,但我认为大多数现代桌面/服务器操作系统都会根据需要对代码进行分页。

答案 2 :(得分:1)

Oups,这是一个有趣的问题,但答案与往常一样:取决于它!

您的问题严重依赖于实施。在旧的(现在过时的)系统中,存在叠加的概念:部分代码仅在需要时才加载到内存中。我不认为它仍然用于现代虚拟内存系统,但它可能对具有有限资源的嵌入式系统有意义。

一些编译器通常可以选择确定堆栈的大小。它可以决定轻量级程序。

并且显然依赖于体系结构:在Unix-Linux上,你有elf与a.out格式,具有不同的内存需求和管理,在Windows上,仍然有旧的.com格式可以导致非常小的可执行文件