创建对未初始化内存的引用是未定义的行为,即使从未读取内存内容.引用the reference, "Behavior considered undefined"(强调我的):
- ...
- Producing an invalid value, even in private fields and locals. "Producing" a value happens any time a value is assigned to or read from a place, passed to a function/primitive operation or returned from a function/primitive operation. The following values are invalid (at their respective type):
- ...
- A reference或
Box<T>
表示dangling,未对齐,or points to an invalid value.
...
Note: Uninitialized memory is also implicitly invalid for any type that has a restricted set of valid values. 换句话说,允许读取未初始化内存的唯一情况是在联合内部和"填充"(类型的字段/元素之间的间隙)中.
这不是obvious,这是UB:有an active discussion about that(部分反驳是为了允许像你这样的事情).然而,目前它被认为是UB,你应该避免它.
(注意:"具有一组受限的有效值"有点模棱两可.是否允许像整数这样的基元类型包含未初始化的位是also a matter of active discussion,但在这种情况下,您也应该避免它,直到解决为止.您可能会声称引用不同意这一点,因为整数没有限制的值集,但这是错误的:可以将一个字节的可能值集视为0
-256
and uninit
字节,事实上这是在许多地方使用的解释.整数不能包含uninit
字节,因此具有一组受限的值).
使用mem::zeroed()
初始化数组是合理的,但没有理由使用unsafe
:您可以只使用一个已初始化的数组,即[0; size]
,它的性能也一样.