更改const pointer

2021-02-02 11:53

的值最近,我无意中发现了Rust和C之间的比较,它们使用了以下内容代码:bool f(int*a,const int*b){*a=2;int ret=*b;*a=3;return ret!=0;}在Rust(相同

解答动态

  • 为什么C编译器不能在假设两个指向同一变量的指针是非法的/UB的情况下优化第一行呢?
    因为您没有指示C编译器这样做。
    C有一个类型限定符,正好是这个名为restrict的类型限定符,大致意思是:这个指针不与其他指针重叠(不完全重叠,但要继续使用)。
    bool f的程序集输出(int*restrict a,const int*b){*a=2;int ret=*b;*a=3;return ret!=0;} is
    mov eax,DWORD PTR[rsi]mov DWORD PTR[rdi],3 test eax,eax setne al ret 。。。从中删除赋值*a=2 https://en.wikipedia.org/wiki/Restrict
    In在C编程语言中,restrict是一个关键字,可以在指针声明中使用。通过添加此类型限定符,程序员向编译器提示,在指针的生命周期内,只有指针本身或直接从指针派生的值(如指针+1)将用于访问指针指向的对象。

    • 函数int f(int*a,const int*b);保证不会通过那个指针改变b的内容。。。它不承诺通过a指针访问变量。
      如果a和b指向同一个对象,通过a更改它是合法的(当然前提是基础对象是可修改的)示例:
      int val=0;f(val);

      • End

      免责声明:

      本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。