wholemodule 优化模式保留了哪些断言?
Which assertions are retained with wholemodule optimization mode?
我能找到的所有关于 Swift 断言的解释都解释说 assert*
被 -O
丢弃,但 precondition*
被保留,除非 -Ounchecked
被设置。
但是,我们现在将 whole-module optimization -wmo
作为发布版本的新默认值。
启用全模块优化时是否保留 precondition*
断言?
考虑这个小程序:
func f(_ i: Int) -> Int {
assert(i > 0, "needed positive number")
return i
}
print(f(0))
用 xcrun swiftc [opt]
和 运行 编译它的结果是:
-Onone
: 断言错误
-Onone -wmo
: 断言错误
-O
:打印 0
-O -wmo
:打印 0
相比之下:
func f(_ i: Int) -> Int {
precondition(i > 0, "needed positive number")
return i
}
print(f(0))
-Onone
: 前置条件错误
-Onone -wmo
: 前置条件错误
-O
:非法指令:4
-O -wmo
:非法指令:4
我无法完全解释最后两个结果,但很明显 whole-module 优化不会影响断言的处理方式;只有优化级别很重要。
这是在
Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)
Target: x86_64-apple-macosx10.9
我能找到的所有关于 Swift 断言的解释都解释说 assert*
被 -O
丢弃,但 precondition*
被保留,除非 -Ounchecked
被设置。
但是,我们现在将 whole-module optimization -wmo
作为发布版本的新默认值。
启用全模块优化时是否保留 precondition*
断言?
考虑这个小程序:
func f(_ i: Int) -> Int {
assert(i > 0, "needed positive number")
return i
}
print(f(0))
用 xcrun swiftc [opt]
和 运行 编译它的结果是:
-Onone
: 断言错误-Onone -wmo
: 断言错误-O
:打印 0-O -wmo
:打印 0
相比之下:
func f(_ i: Int) -> Int {
precondition(i > 0, "needed positive number")
return i
}
print(f(0))
-Onone
: 前置条件错误-Onone -wmo
: 前置条件错误-O
:非法指令:4-O -wmo
:非法指令:4
我无法完全解释最后两个结果,但很明显 whole-module 优化不会影响断言的处理方式;只有优化级别很重要。
这是在
Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)
Target: x86_64-apple-macosx10.9