加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:22:47 所属栏目:百科 来源:网络整理
导读:C编译器在运行程序之前是否分配了所需的所有内存?它是否为最大的内存块分配内存? 在这两种情况下,我都在询问静态分配的内存,我理解在动态内存分配中,在运行时请求内存. 见下面的代码 #include stdio.h int global_flag = 1; //using 4 bytes void create_8
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字节的堆栈内存

>离开主要

>你没有使用堆栈内存

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读