发布时间:2022-08-19 11:51
#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
原生小程序 之事件绑定(数据绑定) 与 事件传参 下拉刷新、触底事件等
vue.config.js 中 devServer.proxy 配置说明,以及配置正确不生效问题
干货|语义网、Web3.0、Web3、元宇宙这些概念还傻傻分不清楚?(上)
[JavaWeb开发中]HTTP 协议的基本格式和Fiddler抓包工具
【区块链实战】什么是 hash 函数,区块链用 hash 函数来干什么
高仿京东Android App,集成React-Native热更功能
Java项目:校园宿舍管理系统(java+Springboot+Vue+maven+redis+Mysql)
opencv在pycharm中没有智能提示,或者报错:无法导入cv2模块