c++ - 这在内部是如何工作的 int const iVal = 5; (int&)iVal = 10;

标签 c++ c compiler-construction

我想知道以下在编译器级别是如何工作的。

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

一点 m/c 或编译器级别的答案就足够了。

提前致谢。

最佳答案

undefined behavior .

在第一行中,您定义了一个常量整数。此后,在您的程序中,允许编译器仅将 iVal 替换为值 5。它可能会改为从内存加载它,但可能不会,因为那样不会带来任何好处。

第二行写入编译器告诉您包含数字 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

关于c++ - 这在内部是如何工作的 int const iVal = 5; (int&)iVal = 10;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/661464/

相关文章:

C++ 继承获取错误

c - 偏移指针的正确方法是什么?

c++ - 编译时出现警告,但程序可以运行;该怎么办?

c - 未识别结构类型?

compiler-construction - 词法分析器什么时候将标记返回给解析器?

c++ - 按位异或与求和之间的性能差异似乎不大

c++ - 在 C++ 中设置二维数组的默认值

c - 函数定义中的参数为空,但声明中为原始数据类型

c - 遍历数组,检查是否 a+b+c == A 但避免重新检查 c+b+a 等

c++ - 为什么虚函数不能使用返回类型推导?