导航:首页 > 源码编译 > 编译器管理作用域

编译器管理作用域

发布时间:2022-08-16 12:47:26

1. c++中为什么有些变量在编译是就由编译器分配了内存空间,还没有运行怎么会占用内存呢

还没有运行怎么会占用内存呢?!(这一点还要怀疑吗!?)

所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大小可以明确计算出来,并且不会再改变,因此它们可以直接存放在可执行文件的特定的节里(而且包含初始化的值),程序运行时也是直接将这个节加载到特定的段中,不必在程序运行期间用额外的代码来产生这些变量。

其实在运行期间再看“变量”这个概念就不再具备编译期间那么多的属性了(诸如名称,类型,作用域,生存期等等),对应的只是一块内存(只有首址和大小),所以在运行期间动态申请的空间,是需要额外的代码维护,以确保不同变量不会混用内存。比如写new表示有一块内存已经被占用了,其它变量就不能再用它了; 写delete表示这块内存自由了,可以被其它变量使用了。(通常我们都是通过变量来使用内存的,就编码而言变量是给内存块起了个名字,用以区分彼此)

内存申请和释放时机很重要,过早会丢失数据,过迟会耗费内存。特定情况下编译器可以帮我们完成这项复杂的工作(增加额外的代码维护内存空间,实现申请和释放)。从这个意义上讲,局部自动变量也是由编译器负责分配空间的。进一步讲,内存管理用到了我们常常挂在嘴边的堆和栈这两种数据结构。

最后对于“编译器分配空间”这种不严谨的说法,你可以理解成编译期间它为你规划好了这些变量的内存使用方案,这个方案写到可执行文件里面了(该文件中包含若干并非出自你大脑衍生的代码),直到程序运行时才真正拿出来执行!

2. 编译器的组成及各部分的功能及作用

1. 词法分析 词法分析器根据词法规则识别出源程序中的各个记号(token),每个记号代表一类单词(lexeme)。源程序中常见的记号可以归为几大类:关键字、标识符、字面量和特殊符号。词法分析器的输入是源程序,输出是识别的记号流。词法分析器的任务是把源文件的字符流转换成记号流。本质上它查看连续的字符然后把它们识别为“单词”。 2. 语法分析 语法分析器根据语法规则识别出记号流中的结构(短语、句子),并构造一棵能够正确反映该结构的语法树。 3. 语义分析 语义分析器根据语义规则对语法树中的语法单元进行静态语义检查,如果类型检查和转换等,其目的在于保证语法正确的结构在语义上也是合法的。 4. 中间代码生成 中间代码生成器根据语义分析器的输出生成中间代码。中间代码可以有若干种形式,它们的共同特征是与具体机器无关。最常用的一种中间代码是三地址码,它的一种实现方式是四元式。三地址码的优点是便于阅读、便于优化。 5. 中间代码优化 优化是编译器的一个重要组成部分,由于编译器将源程序翻译成中间代码的工作是机械的、按固定模式进行的,因此,生成的中间代码往往在时间和空间上有很大浪费。当需要生成高效目标代码时,就必须进行优化。 6. 目标代码生成 目标代码生成是编译器的最后一个阶段。在生成目标代码时要考虑以下几个问题:计算机的系统结构、指令系统、寄存器的分配以及内存的组织等。编译器生成的目标程序代码可以有多种形式:汇编语言、可重定位二进制代码、内存形式。 7 符号表管理 符号表的作用是记录源程序中符号的必要信息,并加以合理组织,从而在编译器的各个阶段能对它们进行快速、准确的查找和操作。符号表中的某些内容甚至要保留到程序的运行阶段。 8 出错处理用户编写的源程序中往往会有一些错误,可分为静态错误和动态错误两类。所谓动态错误,是指源程序中的逻辑错误,它们发生在程序运行的时候,也被称作动态语义错误,如变量取值为零时作为除数,数组元素引用时下标出界等。静态错误又可分为语法错误和静态语义错误。语法错误是指有关语言结构上的错误,如单词拼写错、表达式中缺少操作数、begin和end不匹配等。静态语义错误是指分析源程序时可以发现的语言意义上的错误,如加法的两个操作数中一个是整型变量名,而另一个是数组名等。

3. C语言中,变量的按作用域角度分类的几种情况

声明不同的数据类型,你对编译说明了这个数据的大小和运算方式,这样编译程序就可以分配内存的大小和位置。比如你声明一个 int 类型的变量,编译程序就知道分配两个字节,这个空间可以被用来做加、减等数学运算。 存储类型是对编译器说明分配空间的位置。比如一个 int 数据,被声明为auto时,在数据区分配内存,被声明为static时,在程序区分配内存,被声明为寄存器时,在寄存器分配内存(但要不是操系统,不要用这个类型),外部类型是你用其它文件的外部声明是要用。 作用域从编程的角度来讲的,并不像上两个从编译器的角度讲。也就是一个变量可以被不同的作用域使用,或说是否透明。其实外部类型也可以这么理解,但是由于外部类型的声明用到extern关键字,所以常在学习过程中与自动类,寄存器类,外部类和静态类一起学。作用域在C中是由位置决定的,在C++中类的封装中是由public,protect,private关键字决定,在类内也是由位置决定的。

4. 什么是“编译器”

编译信息在pe文件头中,pe告诉系统如何分配内存。

5. C++编译器每个具体的地方如何使用,希望帮助下

找相关书籍资料看吧,这么问太空洞了,不知如何说起。

6. C#中作用域与初始化的问题

根据编译时的情况来看,for 块里的代码到底会不会执行,是未知的,因为 for 的第二项条件(i != 2)是否为 true 是要等到运行时才能知道的,编译时不可能知道
那也就是说,因为编译时对 d 的初次赋值是否会发生是不确定的,所以之后的代码编译就会出错
而你第二张图的代码,那个块里的代码肯定会被执行的,所以编译就不会出错
至于第三张图,我想或许是因为编译器把 while(true) 看作是一定会执行的,所以也不会出错了

7. C语言 编译器 判断变量作用域的方法

你要注意一点,函数内的 每个{}对的区域都是有一个上级{}的, 确定了这个关系后,在一个子{}内部,判断变量是否定义过的过程就是, 本{}中有没有定义,其上级{}中有没有定义,再上级有没有,如果必要一直判断到全局变量。

这里有一点还要注意, 注意变量定义和{}块的先后关系。

8. C语言中 变量作用域的区别

作用域和生存周期是完全不同的两个概念。作用域可以看作是变量的一个有效范围,就像网游中的攻击范围一样;生存周期可以看成是一个变量能存在多久,能在那些时段存在,就像网游中的魔法持续时间……
简单的以一个局部变量来举个例子:
在main函数中声明了变量a,那么a的作用域就是main函数内部,脱离了main函数,a就无法使用了,main函数之外的函数或者方法,都无法去使用a。那么a的生存周期是指a在那些时候存在,具体到这个例子,a什么时候存在,要取决于main函数,或者说,main函数只要被调用,且调用没有完成,那么a就将存在。除此以外的情况,a都将被释放。
生存周期也可以理解为从声明到释放的之间的时间。
变量具体可以分为全局变量、静态全局变量、静态局部变量和局部变量。
按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区
按作用域分:全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。

9. c++内存管理

char *a="asdfasdfasdf",你不能够释放a所占的资源
关于什么时候它的资源会释放,要看它的作用域,如果它的作用域是局部的:比如数据块中{},或函数中,那么在跳出数据块与函数后,它的内存就被释放了,如果它的作用域为全局,或static,那么知道程序结束后,它的内存就释放了
int a = 10;同样也不可以手动释放它所占的内存,关于它什么时候被释放,要看它的作用域,同上,要知道它存在哪里,显然它不会存在动态内存空间,那么它只有存在于静态内存空间与栈空间了,而究竟是静态内存空间,还是栈空间也是由它的作用域决定,作用域为全局的就存在静态内存空间中,作用域为局部的就存在栈内存空间中
如果你的意思是要知道a真正的地址,那么就涉及到逻辑地址于物理地址的概念,设计到内存映射的概念
如果你感兴趣需要多看点书

10. 总结Linux下的4种常用的编译开发工具——编辑器、编译器、调试器及项目管理器的功能。

编辑器:vi,getedit等,写代码用的。
编译器:gcc/g++,把代码编译成二进制程序
调试器:gdb,kgdb等,调试程序用的
项目管理器:一般用eclipse等IDE来管理工程

阅读全文

与编译器管理作用域相关的资料

热点内容
黑马程序员培训机构官网天津 浏览:903
mainjavasrc 浏览:57
如何买服务器挖矿 浏览:291
php批量上传文件夹 浏览:560
安卓固件怎么更新 浏览:169
单片机代码例程网站 浏览:923
UG编程如何多平面轮廓2D倒角 浏览:438
视频压缩渐变纹 浏览:852
什么app能看财经新闻 浏览:40
数学奇迹神奇运算法 浏览:360
大厂的程序员的水平如何 浏览:701
遗传算法入门经典书籍 浏览:879
源码炮台脚本 浏览:621
在位编辑命令 浏览:348
曲式分析基础教程pdf 浏览:15
php生成静态html页面 浏览:965
怎么分割pdf 浏览:813
压缩垃圾报警器 浏览:629
小公司一般都用什么服务器 浏览:968
java获取时间gmt时间 浏览:821