是否对代码的最大块或C中的所有模块的编译器预留的内存?

问题描述 投票:3回答:2

请问C编译器分配所有正在运行的程序或它的内存最大块分配内存之前所需的内存?在这两种情况下,我要求对静态分配的内存,我理解动态内存分配,存储要求在运行时。

请参见下面的代码

    #include <stdio.h>

    int global_flag = 1; //using 4 bytes

    void create_8_bytes()
    {
        /*
         * create 2 integers , total 8 bytes
        */
        int a = 3;
        int b = 6;

    }


    void create_4_bytes()
    {
        /*
         * 1 variable , total 4 bytes
        */
        int a  = 1;
    }

    void main()
    {
        create_8_bytes(); //8 bytes
        create_4_bytes(); //4 bytes
        puts("done");
    }

多少内存将需要运行上述程序?

c memory memory-management
2个回答
4
投票

在不平凡的C / C ++程序,它通常不可能预先知道你会需要多少内存在运行时。这意味着,即使你的编译尝试它最难的,它不能总是产生一个程序,静态储量仅内存各适量。

现代平台通常区分三个内存不足“类型”之间某种程度:

  1. 你的程序分配和使用的整个持续时间内存(静态/全局变量,函数等)
  2. 你的程序在运行时可以要求使用malloc和这样的记忆
  3. 栈存储器

静态内存量,你的程序的需求不容易估计,因为这取决于操作系统,编译器,标准库等上差异很大。然而,你的程序是非常小的,所以这将是惊人的,如果它需要比在任何平台上几千字节以上。在平台上,其中内存是尤为珍贵,很可能是它可能只是几个字节。

您的程序不使用malloc或其他分配的功能,因此它需要没有这样的记忆。

堆栈内存是奇迹发生在这里。堆栈是存储器的区域,该程序可以使用(和重复使用)当一个函数被调用。它的大小取决于平台(它通常在某处记录)和操作系统通常优化其使用,使得之前实际上是尝试使用它的内存不提供给程序。

如果您运行的堆栈内存,不确定的行为发生。在平台上,其中内存是宝贵的,你可能会程序的贪其他一些地区。在最现代的平台上,这些天,你会得到一个崩溃代替。

假设你的程序未进行优化,并粉饰一些平台的详细信息,内存使用会看起来有点像这样:

  • 节目的开始 你不使用堆栈存储器
  • 输入main:建立堆栈帧(〜16个字节的看家) 您使用16个字节堆栈内存
  • 输入create_8_bytes:建立堆栈帧(〜16个字节的内务,8个字节的变量) 您使用40个字节堆栈内存
  • 离开create_8_bytes:释放create_8_bytes使用的堆栈帧 您使用16个字节的内存
  • 输入create_4_bytes:建立堆栈帧(〜16个字节的内务,4个字节的变量) 您使用36个字节的内存
  • 离开create_4_bytes:释放堆栈帧 您使用16个字节的内存
  • 输入puts(使用的存储器量未知) 你用16 + ???的存储器字节
  • 离开puts 您使用16个字节堆栈内存
  • 离开main 你不使用堆栈存储器

正如你所看到的内存使用量的增长,并为您进入和离开功能的收缩。

虽然这提供了有关如何堆栈存储器使用正确的直觉,请记住,编译器通常能够消除你的程序的一部分,如果他们能证明它不会改变结果。这意味着,你可以期望你的局部变量消失,如果你不使用他们,即使你使用它们,这是可能的编译器可以使用其他的转换,将允许这些变量在所有使用没有堆栈存储器。这也有可能是编译器可以使用的东西,你没有明确告诉它堆栈存储器。


2
投票

依赖于编译器,你的环境,操作系统,和其他的东西。还有的将是一个开销比几个字节的更大的反正。

这且不说,最该计划可能会被优化掉,所以那些ints可能是无关紧要的。该方案可以降低到别的,只是puts("done");

这些ints会在堆栈中。所以create_8_bytes会导致有两个整数空间的新的堆栈帧创建(及以上,如堆栈指针,如此反复,这个数字将被关闭)。然后,当create_8_bytes完成后,其栈帧将是无效的,后来create_4_bytes被调用,这使得栈帧来保存int。所有的课程假设没有什么是内联或优化掉的。

你可能不知道是从abcreate_8_bytesacreate_4_bytes是否会“存在”在同一时间。他们不会。当然,实际的内存消耗也不会代表作为函数调用的开销,程序本身(包括装载背后puts必要的代码)和操作系统如何处理内存分配将在总更加相关的是,那十二个字节。如果你正在编译调试版本,那么这一切将是截然不同的一次,因为编译器不优化掉的东西,否则它将包括东西的程序,否则它不会,甚至让一个沙箱环​​境来运行你的程序中,对于即使是最简单的应用程序占用兆字节。

© www.soinside.com 2019 - 2024. All rights reserved.