【Rust日报】 2019-07-31:Debian Buster 将会预装Rust编译器

发布时间:2022-08-17 14:36

「SO问答」既然两个可变引用不能别名为啥Rust编译器没有对其进行优化

#Rust #stackoverflow

该问题的作者描述,比如C代码中:

void adds(int  *a, int *b) {
    *a += *b;
    *a += *b;
}

两个指针a和b有可能互为别名(俩指针指向同一数据),所以clang在编译该代码的时候,会在寄存器中存储两次(%rsi),%eax来防止这种情况。当然也可以使用restrict关键字来对参数进行约束,显式地告诉编译器这俩指针不可能互为别名(但在C语言中,restrict关键字仅仅是告诉编译器可以优化,它不会帮助开发者进行检查,也就是说,很可能因为开发者没有遵循此契约而引发未定义行为)。从而生成的优化代码中只存储一次寄存器。

但是作者发现在Rust中虽然有编译器检查,两个可变引用不存在互为别名的情况,但是编译器并没有因此而进行任何优化:

#![crate_type = "staticlib"]
#[no_mangle]
fn adds(a: &mut i32, b: &mut i32) {
    *a += *b;
    *a += *b;
}

所以他比较担忧,是不是在Safe Rust之下也可能存在别名?

该贴的回复给出了答案:

Rust最初启用了LLVM的noalias属性,但这导致了非预期的编译结果(算是LLVM的一个Bug,等issues 54878修复以后就正常了)。现在也可以使用-Zmutable-noalias=yes参数进行编译就能得到预期结果。

  • Read More

  • issues/54878

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号