关于c++ 中的const 这是什么情况?

void_Function 2013-06-07 05:12:59
如下代码:

const int n = 1;
int n1, n2 = 3;
int *p = (int*)&n;
*p = 2;
n1 = n;
n1 = n2;
int nSize = sizeof(n);
int nSize1 = sizeof(n1);
在int n = 1处加断点1
在n1 = n;处加断点2
然后执行程序到断点1处 查看内存&n内存储的是1
运行到断点2处 查看内存&n内存储的值编程了2
接着往下运行n1 = n发现n1 = 1 此时查看&n内存储的值还是2

接着运行nSize = 4

下面是反汇编
const int n = 1;
0041139E mov dword ptr [n],1
int n1, n2 = 3;
004113A5 mov dword ptr [n2],3
int *p = (int*)&n;
004113AC lea eax,[n]
004113AF mov dword ptr [p],eax
*p = 2;
004113B2 mov eax,dword ptr [p]
004113B5 mov dword ptr [eax],2
n1 = n;
004113BB mov dword ptr [n1],1
n1 = n2;
004113C2 mov eax,dword ptr [n2]
004113C5 mov dword ptr [n1],eax
int nSize = sizeof(n);
004113C8 mov dword ptr [nSize],4
int nSize1 = sizeof(n1);
004113CF mov dword ptr [nSize1],4


看这两句对比
n1 = n;
004113BB mov dword ptr [n1],1
n1 = n2;
004113C2 mov eax,dword ptr [n2]
004113C5 mov dword ptr [n1],eax
TN的 貌似编译器直接给那个n1赋了个1,根本就没有从&n里去取数据,那为什么还要给n分配内存呢?


...全文
255 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
void_Function 2013-06-24
  • 打赏
  • 举报
回复
结贴 了 谢谢各位
void_Function 2013-06-24
  • 打赏
  • 举报
回复
3楼回答靠谱 n常量只有在以后有引用它地址时候才会给它分配空间 编译器编译的时候已经将那个常量n替换成1了 所以反汇编看到的 n1 = n; 004113BB mov dword ptr [n1],1
lm_whales 2013-06-09
  • 打赏
  • 举报
回复
常量,是你和编译器的约定,并不是一定不变的量,你自己毁约,把常量变成变量,编译器虽然允许了。 但是既然你违约了,编译器自然会给你一个惩罚。 于是程序就不再会,按照正常的逻辑执行了。 至少你是这样看的; 实际上编译器,无论怎么做都是对的,编译器没有违约,违约的是你自己。
大尾巴猫 2013-06-07
  • 打赏
  • 举报
回复
既然定义成常量了,为啥还非要通过别的手段去修改? 研究这个和研究i++=++i一样的无聊。
赵4老师 2013-06-07
  • 打赏
  • 举报
回复
编译器优化有时不如人脑优化。 不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
luciferisnotsatan 2013-06-07
  • 打赏
  • 举报
回复
常量折叠么?没看代码,估计就是问这个
starytx 2013-06-07
  • 打赏
  • 举报
回复
怎么都对这个这么感兴趣?
healer_kx 2013-06-07
  • 打赏
  • 举报
回复
这个问题,你可以轻易地找到答案,你都汇编了,还不会google吗?

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧