在这两种情况下,我都在询问静态分配的内存,我理解在动态内存分配中,在运行时请求内存.
见下面的代码
#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字节的堆栈内存
> leave create_8_bytes:释放使用create_8_bytes的堆栈帧
>你使用16字节的内存
>输入create_4_bytes:设置堆栈帧(〜16个字节的内务处理,4个字节的变量)
>你使用36字节的内存
>离开create_4_bytes:释放堆栈帧
>你使用16字节的内存
>输入puts(使用未知的内存量)
>你用16 ???内存字节
>离开
>您使用16字节的堆栈内存
>离开主要
>你没有使用堆栈内存
如您所见,当您进入和离开函数时,您使用的内存量会增大和缩小.
虽然这为如何使用堆栈内存提供了正确的直觉,但请记住,如果编译器能够证明它不会改变结果,那么编译器通常能够删除部分程序.这意味着如果你不使用它们,你可以期望局部变量消失,即使你使用它们,编译器也可能使用其他转换来允许变量根本不使用堆栈内存.编译器也可以使用堆栈内存来处理你没有明确告诉它的事情.