当前位置:  开发笔记 > 编程语言 > 正文

内部如何工作int const iVal = 5; (int&)iVal = 10;

如何解决《内部如何工作intconstiVal=5;(int&)iVal=10;》经验,为你挑选了2个好方法。

我想知道以下如何工作@编译器级别.

int const iVal = 5; 
(int&)iVal = 10; 

一点m/c或编译器级别的答案会非常充实.

提前致谢.



1> 小智..:

这是未定义的行为.

在第一行中,您定义一个常量整数.从此以后,在你的程序中,允许编译器用值5代替iVal.它可以从内存加载它,但可能不会,因为这不会带来任何好处.

第二行写入您的编译器告诉您包含数字5的内存位置.但是,这不能保证有任何影响,因为您已经告诉编译器该值不会更改.

例如,下面将定义一个包含5个元素的数组,并打印一个未定义的值(或者它可以做任何想做的事!它是未定义的)

int const iVal = 5;
(int&)iVal = 10;
char arr[iVal];
cout << iVal;

生成的程序集可能类似于:

sub ESP, 9      ; allocate mem for arr and iVal. hardcoded 5+sizeof(int) bytes
                ; (iVal isn't _required_ to have space allocated to it)
mov $iVal, 10   ; the compiler might do this, assuming that you know what
                ; you're doing. But then again, it might not.
push $cout
push 5
call $operator_ltlt__ostream_int
add ESP, 9



2> sharptooth..:

C风格的强制转换充当const_cast.就像你写的那样

const_cast( iVal ) = 10;

如果您碰巧这样做并且编译器决定不为iVal分配实际内存,则会遇到未定义的行为.

例如,VC7编译好吧.它甚至可以在调试模式下运行.在释放模式下,分配后iVal值不会改变 - 它仍为5.

所以你不应该这样做.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有