Rust 1.66.0 发布
Rust 团队于近日发布了 Rust 1.66.0 新版本,1.66.0 稳定版中的主要更新内容如下:
对有字段的枚举进行显式判别
有整数表示的枚举现在可以使用显式判别,即使它们有字段。
#[repr(u8)] enum Foo { A(u8), B(i8), C(bool) = 42, }
以前,你可以在有表示的枚举上使用显式判别,但是只有在它们的变体都没有字段的情况下。当跨越语言边界传递值时,显式判别很有用,因为枚举的表示需要在两种语言中匹配。
core::hint::black_box
在对编译器产生的机器代码进行基准测试或检查时,防止优化在某些地方发生往往是有用的。在下面的例子中,函数 push_cap
在一个循环中执行了 Vec::push
4 次。
fn push_cap(v: &mut Vec<i32>) { for i in 0..4 { v.push(i); } } pub fn bench_push() -> Duration { let mut v = Vec::with_capacity(4); let now = Instant::now(); push_cap(&mut v); now.elapsed() }
如果你检查 x86_64 上编译器的优化输出,你会发现它看起来相当短。
example::bench_push: sub rsp, 24 call qword ptr [rip + std::time::Instant::now@GOTPCREL] lea rdi, [rsp + 8] mov qword ptr [rsp + 8], rax mov dword ptr [rsp + 16], edx call qword ptr [rip + std::time::Instant::elapsed@GOTPCREL] add rsp, 24 ret
事实上,我们想做基准测试的整个函数 push_cap
已经被优化掉了!
我们可以使用新稳定的 black_box
函数来解决这个问题。从功能上看, black_box
它接受你传递给它的值,并将其直接传回。然而,在内部,编译器将 black_box
视为一个可以对其输入做任何事情并返回任何值的函数。
这对于禁用像我们上面看到的那种优化非常有用。
use std::hint::black_box; fn push_cap(v: &mut Vec<i32>) { for i in 0..4 { v.push(i); black_box(v.as_ptr()); } }
cargo remove
在 Rust 1.62.0 中,我们引入了 cargo add
,这是一个在项目中添加依赖项的命令行工具。现在你可以使用 cargo remove
来删除依赖关系。
稳定的 API
[proc_macro::Span::source_text](<https://doc.rust-lang.org/stable/proc_macro/struct.Span.html#method.source_text>)
[u*::{checked_add_signed, overflowing_add_signed, saturating_add_signed, wrapping_add_signed}](<https://doc.rust-lang.org/stable/std/primitive.u8.html#method.checked_add_signed>)
[i*::{checked_add_unsigned, overflowing_add_unsigned, saturating_add_unsigned, wrapping_add_unsigned}](<https://doc.rust-lang.org/stable/std/primitive.i8.html#method.checked_add_unsigned>)
[i*::{checked_sub_unsigned, overflowing_sub_unsigned, saturating_sub_unsigned, wrapping_sub_unsigned}](<https://doc.rust-lang.org/stable/std/primitive.i8.html#method.checked_sub_unsigned>)
[BTreeSet::{first, last, pop_first, pop_last}](<https://doc.rust-lang.org/stable/std/collections/struct.BTreeSet.html#method.first>)
[BTreeMap::{first_key_value, last_key_value, first_entry, last_entry, pop_first, pop_last}](<https://doc.rust-lang.org/stable/std/collections/struct.BTreeMap.html#method.first_key_value>)
[impl TryFrom<Vec<T>> for Box<[T; N]>](<https://doc.rust-lang.org/stable/std/boxed/struct.Box.html#impl-TryFrom%3CVec%3CT%2C%20Global%3E%3E-for-Box%3C%5BT%3B%20N%5D%2C%20Global%3E>)
[core::hint::black_box](<https://doc.rust-lang.org/stable/std/hint/fn.black_box.html>)
[Duration::try_from_secs_{f32,f64}](<https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.try_from_secs_f32>)
[Option::unzip](<https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.unzip>)
[std::os::fd](<https://doc.rust-lang.org/stable/std/os/fd/index.html>)
其他变化
在 Rust 1.66 版本中还有其他变化,包括
- 你现在可以在模式中使用
..=X
范围。 - Linux 版现在分别用 LTO 和 BOLT 优化了 rustc 前端和 LLVM 后端,提高了运行时性能和内存使用量。
更多详情可查看:https://blog.rust-lang.org/2022/12/15/Rust-1.66.0.html

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
NGINX Unit 1.29.0 发布
Nginx Unit 是一个动态应用服务器,能够与 Nginx Plus 和 Nginx 开源版并行或独立运行。Nginx Unit 支持 RESTful JSON API,可以在不中断服务的情况下更改配置,并可运行基于多种语言和架构的应用。Nginx Unit 生来就是为满足分布式应用的需求而设计的,可为您的服务网格奠定坚实的基础。 Nginx Unit 1.29.0 正式发布,更新内容如下: NGINX JavaScript 集成 NGINX JavaScript(njs)是一个服务器端的 JavaScript 运行时,为超快的初始化进行了优化。njs 最初是为扩展 NGINX 而设计的,它的架构适合于集成,现在它也扩展了 Unit! 这个版本带来了 NGINX JavaScript 引擎与 Unit 的初步整合。未来的版本将扩展这些功能,以实现更复杂的使用。在 Unit 1.29.0 中,JavaScript 模板字符串可以在配置字符串中使用,以执行 JavaScript 表达式。 配置工具 这个版本引入了两个新的命令行工具来简化 Unit 的安装和配置。 setup-unit ...
- 下一篇
每日一博 | 多线程安全问题原理和 4 种解决办法
摘要:多线程访问了共享的数据,会产生线程安全问题。 本文分享自华为云社区《多线程安全问题原理和解决办法Synchronized和ReentrantLock使用与区别》,作者:共饮一杯无。 线程安全问题概述 卖票问题分析 单窗口卖票 一个窗口(单线程)卖100张票没有问题 单线程程序是不会出现线程安全问题的 多个窗口卖不同的票 3个窗口一起卖票,卖的票不同,也不会出现问题 多线程程序,没有访问共享数据,不会产生问题 多个窗口卖相同的票 3个窗口卖的票是一样的,就会出现安全问题 多线程访问了共享的数据,会产生线程安全问题 线程安全问题代码实现 模拟卖票案例 创建3个线程,同时开启,对共享的票进行出售 public class Demo01Ticket { public static void main(String[] args) { //创建Runnable接口的实现类对象 RunnableImpl run = new RunnableImpl(); //创建Thread类对象,构造方法中传递Runnable接口的实现类对象 Thread t0 = new Thread(run...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作