我想知道下面的编译器是如何工作的。
int const iVal = 5;
(int&)iVal = 10;
一点m/c或者编译器级别的答案就足够了。
提前感谢。
最佳答案
它是undefined behavior。
在第一行中定义一个常量整数。此后,在您的程序中,编译器只允许用值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