C++ 关于书上说的“编译的时候分配内存”_snakorse的博客-程序员宅基地

技术标签: C#基础  

1、所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大小可以 明确计算出来,并且不会再改变,因此它们可以直接存放在可执行文件的特定的节里(而且包含初始化的值),程序运行时也是直接将这个节加载到特定的段中,不 必在程序运行期间用额外的代码来产生这些变量。 
其实在运行期间再看“变量”这个概念就不再具备编译期间那么多的属性了(诸如名称,类型,作用域,生存期等等),对应的只是一块内存(只有首址和大小), 所以在运行期间动态申请的空间,是需要额外的代码维护,以确保不同变量不会混用内存。比如写new表示有一块内存已经被占用了,其它变量就不能再用它了; 写delete表示这块内存自由了,可以被其它变量使用了。(通常我们都是通过变量来使用内存的,就编码而言变量是给内存块起了个名字,用以区分彼此) 
内存申请和释放时机很重要,过早会丢失数据,过迟会耗费内存。特定情况下编译器可以帮我们完成这项复杂的工作(增加额外的代码维护内存空间,实现申请和释 放)。从这个意义上讲,局部自动变量也是由编译器负责分配空间的。进一步讲,内存管理用到了我们常常挂在嘴边的堆和栈这两种数据结构。 
最后对于“编译器分配空间”这种不严谨的说法,你可以理解成编译期间它为你规划好了这些变量的内存使用方案,这个方案写到可执行文件里面了(该文件中包含若干并非出自你大脑衍生的代码),直到程序运行时才真正拿出来执行。

 

2、编译其实只是一个扫描过程,进行词法语法检查,代码优化而已,编译程序越好,程序运行的时候越高效。 我想你说的“编译时分配内存”是指“编译时赋初值”,它只是形成一个文本,检查无错误,并没有分配内存空间。 
当你运行时,系统才把程序导入内存。一个进程(即运行中的程序)在主要包括以下五个分区: 栈、堆、bss、data、code
代码(编译后的二进制代码)放在code区,代码中生成的各种变量、常量按不同类型分别存放在其它四个区。系统依照代码顺序执行,然后依照代码方案改变或调用数据,这就是一个程序的运行过程。

 

3、

编译时分配内存 --------------- 编译时是不分配内存的。此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确。所以声明是给编译器看的,聪明的编译器能根据声明帮你识别错误。
运行时分配内存 --------------- 这是对的,运行时程序是必须调到“内存”的。因为CPU(其中有多个寄存器)只与内存打交道的。程序在进入实际内存之前要首先分配物理内存。
编译过程 -------------- 只能简单说一下,因为如果要详细的话,就是一本书了《编译原理》。编译器能够识别语法,数据类型等等。然后逐行逐句检查编译成二进制数据的obj文件,然后再由链接程序将其链接成一个EXE文件。此时的程序是以EXE文件的形式存放在磁盘上。
运行过程 -------------- 当执行这个EXE文件以后,此程序就被加载到内存中,成为进程。此时一开始程序会初始化一些全局对象,然后找到入口函数(main()或者WinMain()),就开始按程序的执行语句开始执行。此时需要的内存只能在程序的堆上进行动态增加/释放了。


原文链接:http://www.cnblogs.com/helinsen/archive/2012/10/02/2710460.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/snakorse/article/details/44096939

智能推荐

HDU 1007 Quoit Design(平面最小点对)_moyangxian的博客-程序员宅基地

题记:首先将这n个点按照x从小到大排序,用分治的思想把这些点拆分,使得两边点的数目都是当前点的个数的一半。S集合分成左集合S1和右集合S2d记录当前状态下的最小距离分情况讨论合并时的问题:1、这个集合只有一个点,返回一个很大的数。(取最小值时会去掉这个数)2、这个集合有两个点,返回这两个点的距离。然后与d取最小值。3、这个集合有三个或三个以上的点:(1)所有点都在左集合或者是右集合,...

节假日查询API接口上线_魔众的博客-程序员宅基地_节假日接口api

为什么需要节假日查询接口系统集成过程中,避免不了需要根据节假日、工作日进行价格、方案的测略调整,这时候就需要用到节假日接口。由于每一年的节假日都会根据一些政策原因做一部分的调整,但是一直以来缺少一种较为有效的节假日获取方式,魔众提供出了一种人工及时维护的假日接口。节假日查询接口具有哪些功能提供中国法定假期规定,提供了基于多日期查询是否为节假日、以及节假日名称的查询接口。接口具有以下优势易用性,快速接入可靠性,靠谱的数据支撑及时性,数据及时更新魔众,提供专业数据支持...

android页面全屏及状态栏和导航栏的(沉浸式)_parade岁月的博客-程序员宅基地

先介绍两篇博客1、关于Activity和AppCompatActivity的区别,可以参考博客 https://blog.csdn.net/today_work/article/details/793001812、Android沉浸式状态栏完全解析,参考https://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650236820&...

OpenCv4Android3.4之Android Studio 人脸检测集成(小白专用)_LvanCham的博客-程序员宅基地

1.首先去OpenCv 下载android SDK(这里自己去下载吧,我不给连接了)2.下载好了 新建项目(项目名自己起)然后导入SDK,步骤为:点击File ->New->Import Module  然后打开你下载好的OPenCv SDK 选择 sdk /java图1 所示。导好了吗?开始下一步咯添加依赖:点击File->Project Structure 左边选中 app ...

cin cout里面的c是哪个单词的首字母?_haimian520的博客-程序员宅基地

学了这么多年的C++,最开始学的就是输入输出cin cout;那么问题来了,cin,cout里面的c是哪个单词的首字母?cin  -->  console incout  -->  console outVISUAL.STUDIO.2010.ESSENTIAL.TRAINING-JGTiSO04 Exploring the Code Editor

C++:error C4996: 'std::_Uninitialized_copy0': Function call with parameters that may be unsafe_UmdCoding的博客-程序员宅基地

错误调试:c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory(348): error C4996: 'std::_Uninitialized_copy0': Function call with parameters that may be unsafe - this call relies on the ca

随便推点

cocos creator 如何用代码给按钮组件添加自定义事件_前端一号站的博客-程序员宅基地_cocos creator 动态添加按钮事件

当我们给节点新增了按钮组件 //获取按钮组件 let button=this.node.getComponent(cc.Button); //创建触发事件 let targetEvent=new cc.Component.EventHandler(); targetEvent.target=this.node; //添加触发模板节点 targetEvent.component='ButtonTest';

Flutter开发:在Flutter Plugin中引入aar——本地maven法_阿俊_的博客-程序员宅基地_flutter引入aar

目的: 在 flutter Plugin中引入 aar引言:Android项目中引入aar,直接放在本地,在gradle中implementation即可,同样操作在Flutter项目却报错not found aar,如此需要其他解决方法。本文中介绍一种自己项目中运用到的maven引入法,供参考~装备:安装mvn :纯原mac使用$ brew install maven 安装,使用了zsh 命令和其他系统一样先去 apache官网下载 maven安装包,然后安装后配置到系统路径操作: ..

使用transformer进行图像分类_人工智能与算法学习的博客-程序员宅基地

文章目录1、导入模型2、定义加载函数3、定义批量加载函数4、加载数据5、定义数据预处理及训练模型的一些超参数6、定义数据增强模型7、构建模型7.1 构建多层感知器(MLP)7.2 创建一...

Keras Model模型方法_qq_41007606的博客-程序员宅基地_keras model

Model模型方法compilecompile(self, optimizer, loss, metrics=None, loss_weights=None, sample_weight_mode=None, weighted_metrics=None, target_tensors=None)本函数编译模型以供训练,参数有optimizer:优化器,为预定义优化器名或优化器对象,参考优...

Mybatis异常:java.lang.ClassNotFoundException: org.mybatis.spring.SqlSessionFactoryBean_CZ__的博客-程序员宅基地

错误信息:Caused by: java.lang.ClassNotFoundException: org.mybatis.spring.SqlSessionFactoryBean at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333) at org.apa

PyQt5:布局_weixin_33840661的博客-程序员宅基地

  在一个GUI程序里,布局是非常重要的。布局的作用是管理应用中的控件在窗体上的摆放位置,以及控件本身的大小尺寸。PyQt5支持三种布局:绝对布局、盒布局、网格布局。1、绝对布局  在窗口上是以像素单位设置尺寸和位置的,所以可以用绝对定位的方式确定控件的尺寸,以及控件在窗口上的位置。本例中,窗口放置三个QLabel控件,并通过绝对布局让这三个QLabel控件在不同的位置显示。实例如下:...