const_cast问题?

babyvox1999 2007-06-27 10:13:46
int main()
{
const int a = 1;
int *p = const_cast<int*>(&a);
*p = 2;

cout <<a<< endl;
cout <<*p << endl;

cout <<&a << endl;
cout <<p << endl;
}

result:
1
2
0x1111
0x1111



...全文
369 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
whalefish2001 2007-08-08
  • 打赏
  • 举报
回复
呵呵,明白了,原来如此,结果还是编译器搞的鬼。
如果你不用常量,用一般的变量就不会这样了。
yifanernei 2007-06-27
  • 打赏
  • 举报
回复
应该有很多类似的贴子了
对const类型,一些编译会做优化处理,在运行时对a的使用直接用1代替
而p是个指针,则会正常的取地址,取内容
你可以在调试时看一下编译成的汇编代码,好像可以通过设置来取消这种优化
mochen5460 2007-06-27
  • 打赏
  • 举报
回复
我在VS2005上试过了,确实如此。不明白,mark
taodm 2007-06-27
  • 打赏
  • 举报
回复
google 常量折叠
const_cast的前提是你自己知道自己在做什么。
显然你现在还不知道自己在做什么。
CCH2024 2007-06-27
  • 打赏
  • 举报
回复
学习了。
星羽 2007-06-27
  • 打赏
  • 举报
回复
关于常量叠算

常量叠算(Constant folding)是一个编译器的优化技巧, 指在编译时就对常量表达式进行预求值。

比如表达式 arrPcf[3 + CNT_MACRO] //#define CNT_MACRO 10

在编译之后便被当作 arrPcf[13]。这样有利于提高运行时性能并减少目标代码尺寸。

这种优化通常仅适用于内置的数值,布尔类型。


.....

集体网上找找文章
星羽 2007-06-27
  • 打赏
  • 举报
回复
cout <<a<< endl;
004113F4 mov esi,esp
004113F6 mov eax,dword ptr [__imp_std::endl (4182A8h)]
004113FB push eax
004113FC mov edi,esp
004113FE push 1 // 看这里,编译器优化直接用 1 替换a了 :)

........................
songzhenqiu 2007-06-27
  • 打赏
  • 举报
回复
我在汇编中看过了,在主函数的栈中,a的地址为ebp-4,它的值的确被改变了,但程序可能在其它地方保存这个值。
在cout <<*p << endl;的过程中,压入的参数为p所指向的内存中的数据,就是主函数中a的内容,为2;

而在cout <<a << endl;的过程中,却直接将1压入参数;
所以结果不同。

64,632

社区成员

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

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