Swift是否具有与Rust的“未初始化”相当的作用?

时间:2018-01-15 20:03:10

标签: swift optimization initialization llvm

Rust标准库具有std::mem::uninitialized功能,允许您手动创建任何类型的未定义(和可能无效)值。这基本上映射到LLVM' undef。我想知道Swift是否有一个等价物,因为我无法通过标准库文档找到一个浏览器。

动机

主要用途是在证明不精确时绕过编译器的正常内存初始化检查。例如,您可能希望使用方法(或在Swift的情况下,属性设置器)初始化结构的某些成员,编译器通常不允许您这样做。使用虚拟值有效,但效率可能较低(如果优化器无法证明虚拟无意义)。

在Rust中,uninitialized值被初始化检查器初始化,但由LLVM未初始化,从而导致更可靠的优化。由于Swift编译器也是在LLVM上构建的,看起来Swift编译器也应该能够支持它。

我的具体用例

我有一个struct,它封装了一组压缩成一个机器字的位域(无符号整数类型)。 struct类型为通过计算属性读取和修改单个字段提供了一个安全便捷的界面。

我还有一个初始化程序,它将相关的字段值作为参数。我可以使用计算属性使用的相同按位运算来初始化底层机器字(在这种情况下我将重复自己),或者我可以通过设置计算属性的值来初始化它。

目前,Swift不支持在self完全初始化之前使用计算属性。 Swift也不太可能支持这种情况,因为计算属性设置器修改现有的机器字,这需要它已经初始化,至少就Swift而言。只有知道我的所有安装人员都会完全初始化该机器字。

我目前的解决方案是简单地将机器字初始化为0,然后运行设置器。由于常量0被简单地吸收到组合字段的按位|链中,因此没有CPU时间丢失,但情况总是如此。在Rust中,我会使用uninitialized值来表达我对优化器的意图。

0 个答案:

没有答案