请问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 / C ++程序,它通常不可能预先知道你会需要多少内存在运行时。这意味着,即使你的编译尝试它最难的,它不能总是产生一个程序,静态储量仅内存各适量。
现代平台通常区分三个内存不足“类型”之间某种程度:
malloc
和这样的记忆静态内存量,你的程序的需求不容易估计,因为这取决于操作系统,编译器,标准库等上差异很大。然而,你的程序是非常小的,所以这将是惊人的,如果它需要比在任何平台上几千字节以上。在平台上,其中内存是尤为珍贵,很可能是它可能只是几个字节。
您的程序不使用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
你不使用堆栈存储器正如你所看到的内存使用量的增长,并为您进入和离开功能的收缩。
虽然这提供了有关如何堆栈存储器使用正确的直觉,请记住,编译器通常能够消除你的程序的一部分,如果他们能证明它不会改变结果。这意味着,你可以期望你的局部变量消失,如果你不使用他们,即使你使用它们,这是可能的编译器可以使用其他的转换,将允许这些变量在所有使用没有堆栈存储器。这也有可能是编译器可以使用的东西,你没有明确告诉它堆栈存储器。
依赖于编译器,你的环境,操作系统,和其他的东西。还有的将是一个开销比几个字节的更大的反正。
这且不说,最该计划可能会被优化掉,所以那些ints
可能是无关紧要的。该方案可以降低到别的,只是puts("done");
。
这些ints
会在堆栈中。所以create_8_bytes
会导致有两个整数空间的新的堆栈帧创建(及以上,如堆栈指针,如此反复,这个数字将被关闭)。然后,当create_8_bytes
完成后,其栈帧将是无效的,后来create_4_bytes
被调用,这使得栈帧来保存int
。所有的课程假设没有什么是内联或优化掉的。
你可能不知道是从a
从b
的create_8_bytes
和a
和create_4_bytes
是否会“存在”在同一时间。他们不会。当然,实际的内存消耗也不会代表作为函数调用的开销,程序本身(包括装载背后puts
必要的代码)和操作系统如何处理内存分配将在总更加相关的是,那十二个字节。如果你正在编译调试版本,那么这一切将是截然不同的一次,因为编译器不优化掉的东西,否则它将包括东西的程序,否则它不会,甚至让一个沙箱环境来运行你的程序中,对于即使是最简单的应用程序占用兆字节。