编译器是为最大的代码块还是C中的所有块保留内存?
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或其他分配函数,因此它不需要这样的内存. 堆栈内存是魔术发生的地方.堆栈是程序在调用函数时可以使用(和重用)的内存区域.它的大小取决于平台(并且通常在某处记录),并且操作系统通常优化其使用,使得在实际尝试使用它之前,存储器不可用于该程序. 如果堆栈内存不足,则会发生未定义的行为.在内存珍贵的平台上,您可能会破坏程序的其他某些区域.在如今的大多数现代平台上,你会遇到崩溃. 假设你的程序没有经过优化,并且对一些平台细节进行了掩饰,那么内存使用看起来会像这样: >开始计划 >你没有使用堆栈内存 >输入main:设置堆栈帧(?16字节的管家) >您使用16字节的堆栈内存 >输入create_8_bytes:设置堆栈帧(?16个字节的内务处理,8个字节的变量) >你使用40字节的堆栈内存 > leave create_8_bytes:释放使用create_8_bytes的堆栈帧 >你使用16字节的内存 >输入create_4_bytes:设置堆栈帧(?16个字节的内务处理,4个字节的变量) >你使用36字节的内存 >离开create_4_bytes:释放堆栈帧 >你使用16字节的内存 >输入puts(使用未知的内存量) >你用16 ???内存字节 >离开 >您使用16字节的堆栈内存 >离开主要 >你没有使用堆栈内存 如您所见,当您进入和离开函数时,您使用的内存量会增大和缩小. 虽然这为如何使用堆栈内存提供了正确的直觉,但请记住,如果编译器能够证明它不会改变结果,那么编译器通常能够删除部分程序.这意味着如果你不使用它们,你可以期望局部变量消失,即使你使用它们,编译器也可能使用其他转换来允许变量根本不使用堆栈内存.编译器也可以使用堆栈内存来处理你没有明确告诉它的事情. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |