最近,我无意中比较了Rust和C语言,它们使用了以下代码:
bool f(int* a, const int* b) {
*a = 2;
int ret = *b;
*a = 3;
return ret != 0;
}
在Rust(相同的代码,但使用Rust语法)中,它生成以下汇编代码:
cmp dword ptr [rsi], 0
mov dword ptr [rdi], 3
setne al
ret
使用gcc时,它会产生以下结果:
mov DWORD PTR [rdi], 2
mov eax, DWORD PTR [rsi]
mov DWORD PTR [rdi], 3
test eax, eax
setne al
ret
文本声称C函数不能优化第一行,因为a
和b
可能指向同一个数字.在Rust中,这是不允许的,因此编译器可以对其进行优化.
现在我的问题是:
该函数的取值为const int*
,即a pointer to a const int.我读到this question,它指出用指针修改const int会导致编译器警告,并导致最糟糕的UB类型转换.
如果我用两个指向同一整数的指针调用此函数,会不会产生UB?
为什么C编译器不能在假设两个指向同一个变量的指针是非法的/UB的情况下优化第一行呢?