当前位置 : 主页 > 编程语言 > c++ >

编译器是为最大的代码块还是C中的所有块保留内存?

来源:互联网 收集:自由互联 发布时间:2021-06-23
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等请求的内存
>堆栈内存

程序所需的静态内存量无法轻易估算,因为它的变化很大,具体取决于操作系统,编译器,标准库等.但是,您的程序非常小,所以如果它在任何平台上都需要超过几千字节.在内存特别珍贵的平台上,它可能只是几个字节.

您的程序不使用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字节的堆栈内存

>离开主要

>你没有使用堆栈内存

如您所见,当您进入和离开函数时,您使用的内存量会增大和缩小.

虽然这为如何使用堆栈内存提供了正确的直觉,但请记住,如果编译器能够证明它不会改变结果,那么编译器通常能够删除部分程序.这意味着如果你不使用它们,你可以期望局部变量消失,即使你使用它们,编译器也可能使用其他转换来允许变量根本不使用堆栈内存.编译器也可以使用堆栈内存来处理你没有明确告诉它的事情.

网友评论