gpt4 book ai didi

c - 假设指向同一变量的两个指针是非法的/UB,为什么 C 编译器不能优化更改 const 指针的值?

转载 作者:行者123 更新时间:2023-12-03 11:23:16 24 4
gpt4 key购买 nike

最近我偶然发现了 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 函数不能优化第一行,因为 ab可以指向同一个数字。在 Rust 中这是不允许的,因此编译器可以将其优化掉。
现在我的问题:
该函数需要一个 const int*这是 a pointer to a const int .我读了 this question它指出,使用指针修改 const int 会导致编译器警告和 UB 中最糟糕的强制转换。
如果我用两个指向同一个整数的指针调用它,这个函数会导致 UB 吗?
为什么 C 编译器不能优化第一行,假设指向同一个变量的两个指针是非法的/UB?
Link to godbolt

最佳答案

函数int f(int *a, const int *b); promise 不更改b的内容通过那个指针 ...它没有 promise 通过 a 访问变量指针。
ab指向同一个对象,改变它 通过 a 是合法的(当然,前提是底层对象是可修改的)。
例子:

int val = 0;
f(&val, &val);

关于c - 假设指向同一变量的两个指针是非法的/UB,为什么 C 编译器不能优化更改 const 指针的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65993616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com