- 1、本文档共12页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
const常量折叠的一些问题(Some problems of folding const constants)
const常量折叠的一些问题(Some problems of folding const constants)
1.看一段程序
Int main (int argc, char * argv [])
{
Const int i = 0;
J = int * (int *) I;
* j = 1;
Cout ENDL I
Cout J ENDL;
Cout I ENDL;
Cout * J ENDL;
Return 0;
}
结果是
0012ff7c
0012ff7c
0
1
2.为什么地址一样, 而值不一样呢?
简单的说, 在编译的时候遇到i编译器做简单的处理, 将变成0.
当有去地址的时候, 编译器为其分配一个内存地址.
当时其本身并不在分配的地址储存其自身的数据
虽然编译器为常量分配了地址, 但是在使用常量的时, 常量并不是存储在为它分配的地址上的, 而是一个立即数
3.网上的一些内容 (1)
正在看的c语言教程是: 从一段代码看常量折叠 # include stdafx.h..
Int main (int argc, char * argv [])
{
Const int e = 3;
/ /! Int * v = E;
W = int * (int *) E;
* w = 6;
Int a;
A = E;
Return 0;
}
* w的值与a的值是否相同?
答案为: * w 为6; 而a 的值为3.
察看生成的asm文件:
_ text ends
Flat Group _ const Data, BSS, _
Assume CS: Flat, Flat, Flat DS: SS:
Endif
Public _ Main
Comdat _ Main;
_ text Segment
_ $e = - 4
_ W $= - 8
_ $= 12
_ near main proc; comdat
; file e: \ code \ th _ in _ C + + \ \ _ Point _ point.cpp const const
Line 8;
Push EBP
MOV EBP, ESP
Sub Esp, 76 000000 4ch
Push EBX
Push ESI
Push EDI
Read DWORD ptr [EBP - EDI, 76]
Mov ecx, 13h 19 000000;
MOV EAX, 858993460 cccccccc h;
Stosd rep
Line 9;
_ MOV DWORD ptr [EBP] and $3
Line 11;
Lea eax, DWORD ptr [EBP] and $_
W $_ MOV DWORD ptr [EBP], EAX
Line 12;
Mov ecx, DWORD ptr [EBP] _ W $
ECx MOV DWORD ptr [6],
Line 14;
MOV DWORD ptr [EBP] _ $3
Line 15;
XOR EAX, EAX
Line 16;
Pop EDI
Pop ESI
Pop EBX
MOV ESP, EBP
Pop EBP
RET 0
_ main end
_ text ends
End
存储在w所指的地址上的数据的确变成了6, 但是赋给a的不是存储在w所指的地址上的数据, 而是3, 即: 编译器在处理e时, 将e简单的换成了3, 进行了常量折叠...
+ + 里的常量折叠 (或者常量替换) 是将const常量放在符号表中, 而并不给其分配内存.编译器直接进行替换优化.
下面是一个cpp文件:
# include....
Const int i = 1;
Int main ()
{
Const int J = 2;
Printf (% d% d, (I, j);
Return 1;
}
那么:
(1) 符号表本身是存在哪里的? 是数据段里吧?
(2) 我要强行取这个变量的地址的时候, 比如:
Int * const PI = R;
* pj = const int J;
这时i和j应该都会被分配内存吧?
Then the memory allocated by I is in the data segment, and the memory allocated by J is on the stack, right?
(3) I know that the const constant of the C language allocates memory. If there is such a program in the C language, then where do
您可能关注的文档
- 05医院工会工作总结(Summary of trade union work in 05 hospitals).doc
- 07公考申论热点问题标本模式社会诚信问题及治理(07 public test application on the hot issues were Problems and social credit governance mode).doc
- 08心理班级工作计划(08 psychological class work plan).doc
- 08申论答案.doc
- 09学年上半年工作总结与计划(Job summary and plan in the first half of the 09 academic year).doc
- 09财富榜看经济分析(09 economic analysis of wealth list).doc
- 0先生的故事(The story of Mr. 0).doc
- 1-2岁宝宝食谱安排(1-2 year old baby recipes).doc
- 1-8月份江西省煤电运运行情况(Operation situation of coal and electricity in Jiangxi Province in 1-8).doc
- 1-系统-6-控制面板篇(1- system -6- control panel section).doc
最近下载
- 学前儿童学习与发展核心经验健康领域.pdf
- 新人教版七年级下册英语U4词汇分类循环训练单(学生版).docx
- 2023年下半年教师资格证《高中生物》真题及答案.pdf VIP
- 电子版个人简历模板简历表格 个人简历.docx VIP
- 国家秘密载体印制资质现场审查必威体育官网网址知识测试试题库.pdf VIP
- 2025年新疆乌鲁木齐市高考数学二模试卷(理科)+答案解析(附后).pdf VIP
- 我的家乡黑龙江双鸭山.pptx
- 初级注册安全工程师考试(安全生产法律法规)考点重点资料梳理.pdf VIP
- (最全)山东省2016建筑工程消耗量定额.pdf
- 2025年徐州工业职业技术学院单招职业技能测试题库(历年真题).docx VIP
文档评论(0)