【发布时间】:2017-03-17 07:25:08
【问题描述】:
具体来说,我有一些 Swift 3.0 日志记录函数,它们将所有语句包装在 if 中,仅当对从 ObjC 桥接的两个 static const 值的操作具有非零结果时才会执行。
func logStuff(_ message: @autoclosure () -> String) {
if a & b != 0 {
// log stuff here...
}
}
变量a 和b 在我的桥接头中声明如下:
static const NSUInteger a = <some literal>;
static const NSUInteger b = <some literal>;
当a & b 的结果为零并且启用了整个模块优化时,编译器是否会忽略对logStuff() 的整个调用?
对此问题的具体答案将不胜感激,但理想的方法是轻松查看 LLVM 在任何情况下实际应用了哪些优化。
【问题讨论】:
-
您可以完全绕过这个问题:为什么不直接使用已建立的日志框架?
-
已经在使用 CocoaLumberjack。尝试为 ObjC 复制 here 中描述的“细粒度日志记录”,而不会对生产环境造成性能影响。
-
编译器有一些开关可以在不同阶段后为您提供结果,例如
-emit-assembly.
标签: swift compilation swift3 llvm