当前位置:首页 » 编程软件 » 编译器在编译时会对变量

编译器在编译时会对变量

发布时间: 2022-04-26 19:11:39

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

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

❷ c++编译系统在编译时对静态存储变量分配存储单元吗

是啊,就是在编译的时候分配的么,不过你也可以动态分配,比如malloc函数,这样的内存是在堆中申请的,所以程序执行的时候才会申请,一般的变量什么的,包括数组都是在栈中存放,堆就是要靠用户管理的数据区域,栈则是有系统自动管理的。

编程中的变量与常量

看完要加分啊.

其实常量有几种, 因为他们的值不能被改变而都叫常量, 但他们是有很大区别的, 因为他们的作用完全不一样.

至于他们的本质区别分几情况.平常定义的变量一般是放在栈或静态区上, 也就是你说的内存中的一个特定的存储区域.

1.宏定义的"常量".就是你的程序里的

#define P 3.14

这个不是跟平常的变量一起存放在栈上, 这个是一个宏, 编译器编译前会将你的代码中所有的P替换为3.14, 所以你的程序在运行时是没有地方存放P这个常量的, 而3.14会跟你的其他可执行代码一起放在内存当中.所以宏定义的"常量"可以说不算一个量了.

2.C++的const定义的"常量", 例如

const int a = 2;

这个a是跟平常的变量一样放在栈上, 只不过编译器在编译时会加一个安全检查, 如果你的代码有显式修改a的地方, 就会报一个编译错误. 但是你还是可以在运行时通过其他方式修改a的值.所以const定义的量跟平常的变量没有什么区别.

3.字符串常量

char* p = "text";

p确实是一个变量, 但其指向的"text"即不放在栈上也不放在代码里,它放在一个专门的静态区域, 如果你修改它的值(不是修改p的值), 会造成内存错误. 所以字符串常量又跟上面两种不一样.

比如下面的程序:

#define P 3.14
main()
{
char* s = "text";
const double a = P;
}

它的内存分布如下:
*******************************
| 静态存储区 |
| "text" |
*******************************
| 栈 |
| s a |
*******************************
| 代码域 |
| char* s = ...|
| const double a = 3.14; |
*******************************

============================================================

这正好就是你说的时间的区别, 但注意不是"运行的时间", 而是他作为"常量"的时间. 从源代码到可执行程序的过程中, #define的常量是在编译前所进行的处理中作为常量(也就是预处理), const是在编译当中作为常量, 而字符串常量则是在运行时无法修改了.

------------------------------------------------------------

至于你说的常量没用是不正确的.我只说上面前两种"常量".

1.#define宏定义的"常量".在多文件的情况下, 普通的变量在第一个文件中定义后又要在其他文件中重新声明, 显然没有宏方便.而且如果用变量的话在它的所有有效区都可以被修改, 肯定是不安全的.另外宏也更直观, 比变量更容易维护.

2.const定义的常量.这种常量一般是为了防止程序员误修改不能被修改的值.特别是一个人写的程序给另外一个人用时, 比如一个字符串, 或一个类的成员.

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

编译器在编译的时候是不会声明变量和分配内存的。 分配内存之类的是在运行时执行的。

一般编译器在编译的时候,只是做代码的格式检查, 然后将代码转换成机器码或中间代码。

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

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

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

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

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

❼ 编译系统(如:VC++6.0)编译时对变量和变量地址如何处理

int a =5;//定义一个变量,并初始化
int *p //定义一指针变量
p = &a; //把a的地址赋给指针变量p

int &a = b;//a是b的引用。也就是b的一个别名。只要改变a的值,b的值也就改变了

❽ 编译器是否对变量名,函数及源代码文件的长度有限制,如果有,为什么会有这些限制

如果没有函数调用的话,编译器恐怕不会产生任何代码……如果有调用的话,会产生调用函数的代码,至于函数的实现在哪里,那不是编译器要考虑的事,链接器才需要查找函数的实现代码并与函数调用代码对上……

❾ C语言中已经声明或定义的变量如果在代码中没有使用到,编译器会怎样处理

就一直在那里放着。如果是全局变量,编译器连提示都没有;若是局部变量编译器在编译时会提醒说某某局部变量没有使用;若你不理会,在代码修改前就不会再提醒了。这些变量未使用,却一直占用着内存空间,但不影响代码的正确性……

❿ 问一下各位,c语言编译器是如何处理变量名的呢

编译器编译到int a;时就在内存中开辟一个两字节的内存空间,并且命名为a

热点内容
scratch少儿编程课程 发布:2025-04-16 17:11:44 浏览:627
荣耀x10从哪里设置密码 发布:2025-04-16 17:11:43 浏览:356
java从入门到精通视频 发布:2025-04-16 17:11:43 浏览:73
php微信接口教程 发布:2025-04-16 17:07:30 浏览:297
android实现阴影 发布:2025-04-16 16:50:08 浏览:787
粉笔直播课缓存 发布:2025-04-16 16:31:21 浏览:337
机顶盒都有什么配置 发布:2025-04-16 16:24:37 浏览:202
编写手游反编译都需要学习什么 发布:2025-04-16 16:19:36 浏览:800
proteus编译文件位置 发布:2025-04-16 16:18:44 浏览:356
土压缩的本质 发布:2025-04-16 16:13:21 浏览:582