2510rs,rust,1.87
·
1.87.0稳定版中有什么
匿名管道
1.87向标准库添加了访问匿名管道.这包括集成std::process::Command的输入/输出方法.如,合二为一现在相对简单将stdout和stderr流,如下,而过去需要额外的线程或相关平台的函数.
use std::process::Command;
use std::io::Read;
let (mut recv, send) = std::io::pipe()?;
let mut command = Command::new("path/to/bin")
//`stdout`和`stderr`都会写入同一个`将两者结合起来`的管道.
.stdout(send.try_clone()?)
.stderr(send)
.spawn()?;
let mut output = Vec::new();
recv.read_to_end(&mut output)?;
//重要的是,在进程退出之前,从管道中读取,以避免在程序发出过多`输出`时,填充`操作系统`缓冲.
assert!(command.wait()?.success());
安全架构内部函数
大多数仅因为需要允许目标功能,而不安全的std::arch的内部函数现在可在允许这些功能的安全代码中调用.如,以下玩具程序使用手动内部函数实现求和数组,现在可对核心循环使用安全代码.
#![forbid(unsafe_op_in_unsafe_fn)]
use std::arch::x86_64::*;
fn sum(slice: &[u32]) -> u32 {
#[cfg(target_arch = "x86_64")]
{
if is_x86_feature_detected!("avx2") {
//安全:检测到在`运行时`已允许该功能,因此可安全地调用此函数.
return unsafe { sum_avx2(slice) };
}
}
slice.iter().sum()
}
#[target_feature(enable = "avx2")]
#[cfg(target_arch = "x86_64")]
fn sum_avx2(slice: &[u32]) -> u32 {
//安全性:`__m256i`和`u32`有相同`有效性`.
let (prefix, middle, tail) = unsafe { slice.align_to::<__m256i>() };
let mut sum = prefix.iter().sum::<u32>();
sum += tail.iter().sum::<u32>();
//`核心`循环现在在`1.87`中是完全安全的代码,因为`内部函数`需要匹配目标特征`(avx2)`与`函数定义`.
let mut base = _mm256_setzero_si256();
for e in middle.iter() {
base = _mm256_add_epi32(base, *e);
}
//安全性:`__m256i`和`u32`有相同有效性.
let base: [u32; 8] = unsafe { std::mem::transmute(base) };
sum += base.iter().sum::<u32>();
sum
}
asm!跳转到Rust代码
内联汇编(asm!)现在可跳转到Rust代码中的标签块.这可实现更灵活的低级编程,如在操作系统内核中实现优化的控制流或更有效地与硬件交互.
1,asm!宏现在支持用作跳转目标的标签操作数.
2,标签必须是返回类型为()或!的块式.
3,该块在跳转到时执行,并在asm!之后继续执行块.
4,在同一个asm!中使用输出和标签操作数调用仍不稳定.
unsafe {
asm!(
"jmp {}",
label {
println!("Jumped from asm!");
}
);
}
在特征定义中impl Trait的特征的精准捕捉(+用<…>)
此版本稳定了使用impl Trait的返回类型,在特征定义中指定特定抓的模板类型和生命期.这允许在特征定义中使用此功能,并在1.82中扩展了非特征函数的稳定性.
一些脱糖示例:
trait Foo {
fn method<'a>(&'a self) -> impl Sized;
//...脱糖如下:
type Implicit1<'a>: Sized;
fn method_desugared<'a>(&'a self) -> Self::Implicit1<'a>;
//...而通过精确抓......
fn precise<'a>(&'a self) -> impl Sized + use<Self>;
//...脱糖如下:
type Implicit2: Sized;
fn precise_desugared<'a>(&'a self) -> Self::Implicit2;
}
稳定的API
Vec::extract_if
vec::ExtractIf
LinkedList::extract_if
linked_list::ExtractIf
<[T]>::split_off
<[T]>::split_off_mut
<[T]>::split_off_first
<[T]>::split_off_first_mut
<[T]>::split_off_last
<[T]>::split_off_last_mut
String::extend_from_within
os_str::Display
OsString::display
OsStr::display
io::pipe
io::PipeReader
io::PipeWriter
impl From<PipeReader> for OwnedHandle
impl From<PipeWriter> for OwnedHandle
impl From<PipeReader> for Stdio
impl From<PipeWriter> for Stdio
impl From<PipeReader> for OwnedFd
impl From<PipeWriter> for OwnedFd
Box<MaybeUninit<T>>::write
impl TryFrom<Vec<u8>> for String
<*const T>::offset_from_unsigned
<*const T>::byte_offset_from_unsigned
<*mut T>::offset_from_unsigned
<*mut T>::byte_offset_from_unsigned
NonNull::offset_from_unsigned
NonNull::byte_offset_from_unsigned
<uN>::cast_signed
NonZero::<uN>::cast_signed.
<iN>::cast_unsigned.
NonZero::<iN>::cast_unsigned.
<uN>::is_multiple_of
<uN>::unbounded_shl
<uN>::unbounded_shr
<iN>::unbounded_shl
<iN>::unbounded_shr
<iN>::midpoint
<str>::from_utf8
<str>::from_utf8_mut
<str>::from_utf8_unchecked
<str>::from_utf8_unchecked_mut
这些以前稳定的API现在在常环境中是稳定的:
core::str::from_utf8_mut
<[T]>::copy_from_slice
SocketAddr::set_ip
SocketAddr::set_port,
SocketAddrV4::set_ip
SocketAddrV4::set_port,
SocketAddrV6::set_ip
SocketAddrV6::set_port
SocketAddrV6::set_flowinfo
SocketAddrV6::set_scope_id
char::is_digit
char::is_whitespace
<[[T; N]]>::as_flattened
<[[T; N]]>::as_flattened_mut
String::into_bytes
String::as_str
String::capacity
String::as_bytes
String::len
String::is_empty
String::as_mut_str
String::as_mut_vec
Vec::as_ptr
Vec::as_slice
Vec::capacity
Vec::len
Vec::is_empty
Vec::as_mut_slice
Vec::as_mut_ptr
删除i586-pc-windows-msvc目标
但窗口10是所有窗口目标(win7目标除外)的最低要求OS版本,它自身需要SSE2指令.
应迁移至i686-pc-windows-msvc.
更多推荐


所有评论(0)