主要观点:
- 介绍了 Rust 中
core::io::BorrowedBuf
,它是一个夜间特性,存在诸多问题。 - 以
slow_copy
函数为例说明零初始化缓冲区的问题及MaybeUninit
的解决方案,但该代码不安全。 - 详细阐述了
BorrowedBuf
的使用及存在的问题,如与现有代码的整合性、通用性、易误用性和复杂性等。 - 探讨了人们希望的未初始化内存的语义及相关实现的困难,如
slice_freeze_mut
函数避免MADV_FREE
导致的问题及优化困难。
关键信息:
core::io::BorrowedBuf
是夜间特性,存在诸多问题,如与现有代码整合困难、通用性受限、易误用、结构复杂等。slow_copy
函数中零初始化缓冲区浪费时间,MaybeUninit
可解决但代码不安全。- 人们希望未初始化内存存储任意数据,需冻结后安全读取,但实现困难,如
slice_freeze_mut
函数避免MADV_FREE
导致的问题需页触摸。
重要细节:
slow_copy
函数中每次循环都零初始化缓冲区,即使read
会覆盖数据,编译器也无法优化。BorrowedBuf
不拥有内存,可指向栈上数组或堆上切片,但其read_buf
方法可选,许多第三方Read
实现不提供该方法。rand
crate 的RngCore::fill_bytes
方法可受益于写入未初始化内存,但需支持BorrowedBuf
,否则需修改代码或使用fork
。BorrowedBuf
结构复杂,需分别存储已填充和已初始化部分信息,以避免重复初始化内存。- 读取未初始化内存在硬件层面不是问题,但
MADV_FREE
系统调用可能导致意外行为,slice_freeze_mut
函数需页触摸以避免该问题。
引用与参考:
[1]:提到&mut [T]
到&mut [MaybeUninit<T>]
的安全转换方式缺失。
[2]:提及人们希望未初始化内存存储任意数据,需冻结后安全读取。
[3]:说明读取未初始化内存在硬件层面不是问题,无未定义行为。
[4]:指出典型 Linux 环境中新分配的匿名页面会被零初始化。
[5]:引用 Donald Knuth 的话,强调应在关键代码处仔细考虑优化。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。