Rust 的自动内存管理使开发人员免于指针操作,并防止低级内存操作引起的问题,例如释放后内存访问、空指针取消引用、缓冲区溢出等。 正在开发一个包管理器来分发库、确保组装并管理项目的依赖关系。
主
- 添加了管道式编译模式(pipelined),在该模式下,依赖项元数据可用后就开始构建依赖包,而无需等待其编译完成。 编译包时,不需要完全组装依赖项,只需定义元数据,其中包括类型、依赖项和导出元素的列表。 元数据在编译过程的早期就可用,因此现在可以更早地编译链接包。 当构建单个包时,建议的模式不会影响性能,但如果构建涵盖具有分支依赖项的包,则总体构建时间可以减少10-20%;
- 确保检测到功能的错误使用
std::mem::未初始化 иstd::mem::归零 。 例如, std::mem::uninitialized 可以方便地快速创建数组,但它会误导编译器,因为它看起来已初始化,但实际上该值仍未初始化。 mem::uninitialized 函数已被标记为已弃用,建议使用中间类型代替也许单位 。 至于 mem::zeroed,此函数可能会导致无法接受零值的类型出现问题。为了帮助识别未定义的行为,新版本向编译器添加了 lint 检查,以检测 mem::uninitialized 或 mem::zeroed 的一些问题。 例如,现在尝试将 mem::uninitialized 或 mem::zeroed 与类型 &T 和 Box<T> 一起使用时会出现错误,这些类型表示不能接受空值的指针对象;
- “#[deprecated]”属性已扩展,允许将 crate 包标记为过时并计划将来删除。 从 Rust 1.38 开始,该属性也可用于宏;
- 添加了在子模块中使用“#[global_allocator]”属性的功能;
- 新增功能
std::any::类型名称 ,它允许您找出类型的名称,这对于调试目的很有用。 例如,在程序执行期间,您可以找出调用函数的类型:fn gen_value<T:默认>() -> T {
println!("初始化 {} 的实例", std::any::type_name::<T›());
默认::默认()
}fn 主(){
让 _: i32 = gen_value(); # 将打印“i32”
让_:字符串= gen_value(); # 将打印“alloc::string::String”
} - 标准库的扩展功能:
- slice::{concat, connect, join} 现在除了 &T 之外还可以获取值 &[T];
- “*const T”和“*mut T”现在实现标记::取消固定;
- “Arc<[T]>”和“Rc<[T]>”现在实现 FromIterator<T>;
- iter::{StepBy, Peekable, Take} 现在实现 DoubleEndedIterator。
- ascii::EscapeDefault 实现克隆和显示。
- 新的部分 API 已转移到稳定类别,包括已稳定的方法
- <*const T>::cast, <*mut T>::cast,
- 持续时间::as_secs_f{32|64},
- 持续时间::div_duration_f{32|64},
- 持续时间::div_f{32|64},
- 持续时间::from_secs_f{32|64},
- 持续时间::mul_f{32|64},
- 除法运算与余数
div_euclid 和 rem_euclid 适用于所有整数基元;
- 添加了对多次指定“--features”选项的支持,以在货物包管理器中启用不同的功能;
- 编译器提供了第三个
水平 支持目标平台 aarch64-uwp-windows-msvc、i686-uwp-windows-gnu、i686-uwp-windows-msvc、x86_64-uwp-windows-gnu、x86_64-uwp-windows-msvc 目标、armv7-unknown-linux -gnueabi、armv7-unknown-linux-musleabi、hexagon-unknown-linux-musl 和 riscv32i-unknown-none-elf。 第三级涉及基本支持,但没有自动化测试和官方版本的发布。
来源: opennet.ru