苹果LLVM编译器会优化重复的属性访问吗?

4

考虑以下启用了ARC的Objective-C代码:

[self.aProperty sendMessage];
if (self.aProperty)
{
    [self doSomethingWithProperty:self.aProperty];
}

我在想,将代码重写成以下片段是否会更快(在发布版本中):
MyPropertyClass* myProperty = self.aProperty;
[myProperty sendMessage];
if (myProperty)
{
    [self doSomethingWithProperty:myProperty];
}

问题是:苹果LLVM编译器3.0能否优化对属性getter的重复访问?如果属性是非原子的,是否会有任何区别?
如果我必须猜测,我会说写下面的代码更快,因为编译器不能保证在这些行期间self.aProperty不会改变。我是正确的吗?

我会说相同的话..而且我不确定原子性在getter中是否有所不同...在self对象内,我通常会直接访问自动创建的实例变量_myProperty - Bastian
我会怀疑它不能缓存属性的值(因为副作用问题,如上所述);虽然似乎逻辑上它可以内联getter本身(但我不知道它是否这样做——JVM和CLR会进行运行时优化)。 - user166390
1个回答

7
重要的不是原子性与非原子性的问题,而是getter方法无法保证纯净或幂等。多次调用getter方法可能不能等同于单次调用。例如,每次调用someNSEnumerator.nextObject都会返回一个不同的结果,因此在一般情况下不可能进行这样的优化。
然而,关于“更快”的问题,我怀疑两个代码片段都不会有明显的速度差异。正确的答案是进行分析,看看这段代码是否经常运行,并且值得费这个劲去做这个优化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接