网站大量收购独家精品文档,联系QQ:2885784924

const常量折叠的一些问题(Some problems of folding const constants).doc

const常量折叠的一些问题(Some problems of folding const constants).doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

您可能关注的文档

文档评论(0)

f8r9t5c + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档