探秘!编译器眼中不一样的变量名
我们在使用C语言或C时,常用的变量定义范围有全局全局变量、全局静态变量、局部静态变量、函数内部局部变量等,我们也知道函数内部局部变量和全局变量重名、函数内部静态变量和全局静态变量重名时,都是使用的函数内部声明变量,那么编译器是如何做到的呢?
这就要从编译过程开始说起了。。。。编译过程
图片来自网络
图片来自网络测试代码includeiostreamusingnamespacestd;intGa0;intGb;staticintsc1;staticintsd;intfun(){staticintsc2;intGb2;staticintse2;intinase;returnina;}intmain(){intmbfun();coutmbmbendl;mbfun();coutmbmbendl;Gb3;return0;}编译操作
Preprocessor(预处理):
处理一些号定义的命令或语句(如define、include、ifdef等),生成。i文件。
gotestvariable。iEtestvariable。cpp
Compiler(编译)
进行词法分析、语法分析和语义分析等,生成。s的汇编文件
gotestvariable。sStestvariable。i
Assembler(汇编)
将对应的汇编指令翻译成机器指令,生成二进制。o目标文件
gotestvariable。octestvariable。s
Linker(链接)动态链接:
在链接期,只在可执行程序中记录与动态链接库中共享对象的映射信息。在程序执行时,动态链接库的全部内容被映射到该进程的虚拟地址空间。其本质就是将链接的过程推迟到运行时处理。静态链接:
在链接期,将静态链接库中的内容直接装填到可执行程序中。在程序执行时,这些代码都会被装入该进程的虚拟地址空间中。
gotestvariablectestvariable。o
编译后的中间文件解析
。i文件:
预编译时,把引用的头文件内容和当前对应cpp代码拷贝进来,并把名空间等进行展开,打开或关闭对应的编译宏。
。s文件:
进行词法分析、语法分析和语义分析等,生成。s的汇编文件。此时会把变量和函数等根据是否全局、静态类型等命名成不冲突的其他名称。
从生成的文件可以看出来,初始化的全局变量、未初始化的全局变量、全局静态变量、局部静态变量、静态函数等,名称都是按照编译器的规则进行了原样保持或添加了其他字符做唯一标识。编译器这么做的原因,就是为了保证符号唯一性,从而能对应上编译出的静态地址。
备注:变量名在运行时不存在,它们在编译期间被丢弃。但是,编译器可能会发出存储在应用程序二进制文件中的调试信息,以允许开发人员调试应用程序。但是,这通常会在发布版(Release版本会去除g信息或通过strip去除符号信息)中删除。
使用nm命令查看可执行文件内部的符号信息:
。o文件:
将对应的汇编指令翻译成机器指令,生成二进制。o目标文件。咱们用文本文件打开查看是乱码,但是可以通过https:gcc。godbolt。org工具在线查看汇编代码。
总结
虽然我们在写代码时,编译器会自动帮我们做一些工作,平时多了解一些编译器内部实现原理,对我们的编码质量和编码效率提升还是很有帮助的。
山西银行2021年亏损46。7亿计提信用减值损失41。3亿来源中国经济网中国经济网北京7月5日讯近日,山西银行股份有限公司(简称山西银行)发布2021年度报告。2021年,山西银行实现营业收入27。05亿元,净利润46。73亿元。山西银行
英国政坛大地震?两位高官同日宣布辞职矛头直指首相约翰逊财联社7月6日讯(编辑夏军雄)随着两位高级官员宣布辞职,英国首相鲍里斯约翰逊再次遭遇严重的政治打击。当地时间周二(7月5日),英国卫生大臣赛义德贾维德和财政大臣里希苏纳克相继宣布辞
天外有天!欧美制裁俄罗斯终食恶果,美国难辞其咎天外有天!欧美制裁俄罗斯终食恶果,美国难辞其咎!大罢工席卷欧美大地,以美国为首的国际联盟更是一次又一次的惨剧!这次罢工不是一个国家,而是很多国家,英国法国德国西班牙瑞典荷兰丹麦和美
赵海珍的世界连载个人拙笔编译仅供同好分享版权归属原网请勿二改二传趙海珍韩国小说家2004年通过文艺中央上发表作品,进入文坛小说集天使之城我们周四见光的护卫长篇小说无限美好的梦中遇见卢基完无人可见的
美国俄州非裔男子遭警方乱枪打死遗属盼制度性改变希望被当作人对待7月3日,美国俄亥俄州,在民众抗议警察枪杀沃克的游行中,一名女子与防暴警察对峙。海外网7月4日电据美国有线电视新闻网4日报道,美国俄亥俄州阿克伦市近日发生了25岁的非洲裔男子杰兰德
对话陈志武不管哪个年代,企业家对社会的贡献都非常大商业造就了规则和秩序。文中国企业家记者姚赟头图摄影史小兵从稳定中寻求安全感,这本就是人类天性。但在如今的局势下,地缘冲突不断新冠疫情的反复也增添了众多不确定性。在不得不面对多变大环
高铁通到家门口,库区乡村更闹热了工人日报中工网记者李国通讯员张卓我在巫山高铁站修了3年的路,时间一晃就过去了,郑渝高铁终于通车了,家乡真是一年一个新变化。7月5日,家住重庆巫山桂花村民陈炳光高兴地说。村里道路变得
西媒俄乌冲突引发西方经济多米诺骨牌效应西班牙国家报网站7月2日发表题为世界经济泄气即将到来的危机什么样?的文章,文章认为,就好像是用多米诺骨牌组成的结构一样,俄乌冲突使通货膨胀利率增长这几张骨牌依次倒下。全文摘编如下最
数十年的全球化进步几年内被逆转最贫穷经济体受伤最大香港南华早报网站6月29日发表题为被误导的地缘政治正在扰乱数十年的全球化,将最脆弱的国家推向灾难边缘的文章,作者是丹斯泰因博克。文章指出,在过去十年中,世界贸易投资和移民的减少,加
土耳其发现7亿吨稀土资源,对我国冲击很大吗?据俄罗斯卫星通讯社援引土耳其日报报道,位于土耳其西北部的埃斯基谢希尔省发现大量稀土资源,其储量有6。94亿吨,可满足全球1000年的需求。土耳其发现了如此巨大的稀土资源,会冲击到我
日元贬值,赌上国运的最后一博自进入2022年以来,日元呈现持续贬值的走势,并不断创下历史新低。目前对人民币一直维持在4。9左右的范围内,迟迟回不到5的水平日元对美元一度跌至1美元136日元的低位,不断刷新最低