导航:首页 > 源码编译 > 编译器如何规划变量

编译器如何规划变量

发布时间:2022-08-27 09:11:30

⑴ C++中如何定义变量

简单说:你要定义一个整形变量就是直接“类型 变量名;”就行。例如定一个叫做a的整形变量
“int a;”
详细说明:
在C++中,变量声明(declaration)只有在使用extern关键字时才成立,其他情况下都是定义(definition),而在使用extern的同时给变量赋初始值,则声明变为定义,extern关键字也将被编译器忽略。C++变量的作用域缺省情况下是全局的,也就是对多个源文件可见,比如说,如果在a.cpp和b.cpp中都有
int a;
则编译器链接两个文件时会报告错误,“变量重复定义”。因此,要使变量定义只对该源文件可见,就要显式加上static关键字。因此,我们可以想到,如果在a.cpp中有
extern int a;
而在b.cpp中有
static int a = 9;
那么,编译器链接时会给出错误信息,“找不到a的定义”,因为a的定义在b.cpp并只对该文件可见,a.cpp找不到a的定义因此出错。
变量的声明和定义是比较容易混淆的概念,因此记住一点,除非有extern关键字,否则都是变量的定义。由此,我们可以归纳出几点好的程序设计风格:
1. 不要把变量定义放入.h文件,这样容易导致重复定义错误。
2. 尽量使用static关键字把变量定义限制于该源文件作用域内,除非该变量被设计成全局的。
例外情况是const变量和typedef类型,在《The C++ Programming Language》9.2节中说到,const和typedef缺省作用域是局部的,因此不需要static来显式声明。因此,在.h文件中放置const变量定义不会产生问题,编译器会给每个引用该.h文件的源文件产生一份该const变量的局部定义,就像该变量是定义于该源文件中一样。大家也不用太担心编译器这么做会浪费空间,因为编译器优化过程一般会把有相同值的const变量进行合并。
对于static关键字,要多说几句的是,static一般有两种意思,当修饰函数定义里的变量或者类成员变量时,称作静态变量;修饰其他变量时,称作局部变量。为防止混淆,一般不要特意给局部变量加上static关键字。除了static关键字,namespace也可以使变量定义成为局部的。

⑵ 编译器在编译的时候做了什么给申明的变量分配内存

第一是将java文件编译成字节码文件 就是class文件 给jvm执行
第二就是分配常量池 就是给你代码里面的变量和方法分配空间

⑶ 在Mac电脑里怎么将编译器添加到PATH环境变量中

mac 一般使用bash作为默认shell
Mac系统的环境变量,加载顺序为:
/etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc
当然/etc/profile和/etc/paths是系统级别的,系统启动就会加载,后面几个是当前用户级的环境变量。后面3个按照从前往后的顺序读取,如果~/.bash_profile文件存在,则后面的几个文件就会被忽略不读了,如果~/.bash_profile文件不存在,才会以此类推读取后面的文件。~/.bashrc没有上述规则,它是bash shell打开的时候载入的。

⑷ Inno Setup 编译器”如何打包 javaWeb 应用程序,自动设置环境变量

三、打包步骤

1、打开Inno Setup编译器,新建脚本向导,填写程序的基本信息,如图:

2、点击下一步,选择文件类型与名称;

3、点击下一步,勾取“”应用程序没有主执行文件,并添加文件夹,如上面提到的D:webexe,并把子文件夹中的文件包含在内

4、点击下一步,选取程序图标设置;

5、点击下一步,指定安装前后显示的文件信息和许可文件;

6、点击下一步,选择安装语言;

7、点击下一步,选择编译器输出的路径和exe安装包的名称等,如图:

8、点击下一步,编译脚本即完成。

打开

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

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

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

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

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

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

⑹ 编译器对c语言中变量名怎么编译

对于变量名,会根据变量类型
开辟不同大小的内存空间
然后指定一个相对地址记录下来。
对于编译后, 不存在变量名,只有对应的相对地址。

⑺ 我们经常看到书上面说的 某某变量的内存单元是编译器在编译时候分配的 是什么意思

所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大小可以

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

⑻ 编译器编译高级语言为低级语言的时候,给全局变量或静态变量是如何分配内存的

对于C和C++的编译器,全局变量和静态变量都是在专门的数据区保存的,更具体一点,一般是在.data和.bss段保存的,具体在哪个段,编译器会根据代码中是否对这些变量进行了初始化来决定,如果初始化过,并且初始化的值不为0,那么这个这个变量一般就会被放在编译结果的.data段中,否则就是放在.bss段中。
.data段中就保存变量的符号,还保存变量的初始化值,而在.bss段中,只保存变量的符号,而不保存值,这是因为这部分的变量都将被初始化为0,这也是为什么static声明的变量即使没有初始化也会是0的原因。
这些段都会在程序被执行的时候由操作系统(或链接器)加载到指定的内存中,便完成相应的初始化。

⑼ 编译器对作为局部变量的数组是怎么管理的放在堆栈中

C语言的堆跟栈是有区别的,请大家不要混淆。
局部变量和函数调用时的实参是放在栈里。所以有大家常说函数调用时的入栈,出桟这个说话。
动态申请的内存放在堆里的。
全局变量和静态变量是放在另外的全局内存区。

阅读全文

与编译器如何规划变量相关的资料

热点内容
怎样去连接加密wifi 浏览:682
有什么app自带拍摄模板的 浏览:435
登录相亲网为什么要下载app呢 浏览:545
加密货币和主权货币撮合 浏览:683
哪里能学app 浏览:445
spline怎么看源码 浏览:18
桂妃app哪里下载 浏览:236
android代码格式化快捷键 浏览:829
如何判断服务器的硬盘 浏览:654
云服务器挑选顺序 浏览:887
卡银家平台源码 浏览:417
怎么样设置服务器的ip地址 浏览:900
泡沫APP在哪里下载 浏览:937
简述高级语言进行编译全过程 浏览:39
管家婆辉煌2加密狗挪到另一台电脑 浏览:760
摩托车在哪里app看考题 浏览:356
苹果5app在哪里设置 浏览:737
如何查看服务器的磁盘使用 浏览:165
python蒙特卡洛模型投点图 浏览:331
安卓手机属于什么接口 浏览:742