Ios 在GCC/Clang上,NULL no-op编译成什么?
在我的代码中,我有几个调试函数,当指定build标志-release时,调用全部替换为NULL(为了性能);例如:Ios 在GCC/Clang上,NULL no-op编译成什么?,ios,objective-c,gcc,clang,llvm,Ios,Objective C,Gcc,Clang,Llvm,在我的代码中,我有几个调试函数,当指定build标志-release时,调用全部替换为NULL(为了性能);例如: self.condition ? NULL : NULL; 其中第一个和第二个null是在预处理中被替换的函数调用 我的问题是,如果有什么的话,这个编译是为了什么?我使用的是苹果的LLVM5.1;显然,对我们来说,这是一个no-op,那么这是否意味着它不会从这行生成任何指令?我希望是这样,因为没有很好的理由实际执行任何操作。我想这取决于上下文 由于self.condition是[
self.condition ? NULL : NULL;
其中第一个和第二个null是在预处理中被替换的函数调用
我的问题是,如果有什么的话,这个编译是为了什么?我使用的是苹果的LLVM5.1;显然,对我们来说,这是一个no-op,那么这是否意味着它不会从这行生成任何指令?我希望是这样,因为没有很好的理由实际执行任何操作。我想这取决于上下文 由于
self.condition
是[self-condition]
的别名,因此只有当编译器能够肯定地断言[self-condition]
没有副作用时,才能省略该调用。如果编译器无法确定没有副作用,则可以将整个语句优化为[self-condition]代码>产生轻微的优化
\u条件?空:空代码>应该是安全的死剥离,因为没有可能产生副作用的相关方法调用。检查反汇编,这是确保安全的唯一方法。非常好;关于这个调用,您是对的,所以我在条件方法中添加了属性((pure))