6167|5

89

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

程序中的变量名在编译之后成了什么? [复制链接]

我一直有个疑惑,我们都知道内存中的数据是分段存储的,但是我就一直不能理解,程序编译之后,源程序中的变量名是否也编译成为数据值了,而且这个变量的指针是由谁指向的,当变量名也被编译为值的情况下,必然会导致内存的占用,是否就是说,从节约存储资源或者说是提高内存寻址效率考虑,我们尽量要使用单字符变量名呢?如果变量名没有被编译为值,是按照变量使用的顺序进行存储的,又如何保证数据的存取顺序不会出错呢?还请各位大虾指点指点,最好有图示说明。

最新回复

谢谢各位,我已经清楚了不少了,可是为什么我用反射工具去查看代码的时候,还是有类名和变量名呢?难道C#编译之后和别的不一样,仍然保留了变量名?  详情 回复 发表于 2010-5-20 12:18
点赞 关注

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
编译之后没有变量名了。
只有堆。
如,
当前stack=10000;
当定义 INT32 a; a的偏移地址=10000-4=9996;
访问时,a=0;  则通过便宜地址+基址获得a的绝对地址,将0写入这个绝对地址。

一句话,CPU里面没有所谓的变量名,只有约定的地址。
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
变量名的长度对内存的使用是没有影响的,实际上变量在内存中只是一个固定位置的数据,编译器在编译的时候就会自动帮你处理用到这个变量的时候到相应的位置取数据,所以不会出现存取顺序的问题。如果可以的话你看一下编译生成的汇编代码就明白了。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
全局变量和static变量,在编译的时候就分配地址了。所以,变量已变成了唯一的地址。当然,局部变量就是在运行过程中分配栈地址的。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
局部变量实质上也是通过编译拥有了一个相对pc的偏移地址,所以其实除非是动态分配的东西,地址都是在编译阶段唯一的确定下来了。变量名本身也就没有意义了,所以编译以后变量名可以说是没了。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

6
 
谢谢各位,我已经清楚了不少了,可是为什么我用反射工具去查看代码的时候,还是有类名和变量名呢?难道C#编译之后和别的不一样,仍然保留了变量名?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表