Apple LLVM编译器是否优化了重复的属性访问?

Lea*_*s2D 4 optimization objective-c compiler-optimization automatic-ref-counting

考虑这个Objective-C代码(启用ARC):

[self.aProperty sendMessage];
if (self.aProperty)
{
    [self doSomethingWithProperty:self.aProperty];
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否重写代码到下面的剪辑会更快(在发布版本中):

MyPropertyClass* myProperty = self.aProperty;
[myProperty sendMessage];
if (myProperty)
{
    [self doSomethingWithProperty:myProperty];
}
Run Code Online (Sandbox Code Playgroud)

问题是Apple LLVM编译器3.0是否能够优化对财产获取者的重复访问?如果房产是非原子的,这会有什么不同吗?

如果我不得不猜测,我会说编写下面的代码更快,因为编译器无法保证self.aProperty在这些行中不会改变.我对吗?

Chu*_*uck 7

比原子与非原子问题更重要的是,不能保证吸气剂是纯粹的或幂等的.多次调用getter可能不等同于调用一次.例如,someNSEnumerator.nextObject每次调用它时都会返回不同的结果.因此,在一般情况下不可能进行这样的优化.

但是,关于"更快",我怀疑任何代码片段都会明显更快.正确的答案是分析,看看如果这个代码经常运行足以值得麻烦,它是否有任何区别.