发布时间:2022-08-17 14:36
#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
PD-GAN: Probabilistic Diverse GAN for Image Inpainting
thinkphp使用paginate()分页后给结果集追加字段或数据
菜鸟学Kubernetes(K8s)系列——(一)关于Pod和Namespace
android7新特性之 support library 25.0.0
OpenHarmony标准设备应用开发(三)——分布式数据管理
【NLP】四万字全面详解 | 深度学习中的注意力机制(四,完结篇)
uni-app实战之社区交友APP(12)文章和话题API开发