带指针的辅助变量是否会对性能/内存产生影响?

时间:2012-08-21 20:01:00

标签: objective-c performance variables

是吗?

我通常会选择这个,

NSArray * monthsForChosenYear = [self monthsForYear:newChosenYear];
[self setMonths: monthsForChosenYear];

在此之上,

[self setMonths: [self monthsForYear:newChosenYear]];

主要是因为乍一看很容易理解。第二种方法,不是那么多。

但这究竟意味着什么呢? monthsForChosenYear,只是一个指针,但它必须以某种方式存储。

我不是在问这个影响是否太小以至于我不需要担心它。但我对此非常好奇。

即使重定向到更详细解释的某个文档也不错。

提前谢谢!

努诺

3 个答案:

答案 0 :(得分:5)

一个很长的答案,希望能缓和你的好奇心,好奇心好!表演&内存影响要么为零,要么微不足道。你想知道指针是如何存储的。当您输入:

NSArray * monthsForChosenYear;

您要求在名称monthsForChosenYear中引用一个框(变量),以便在本地存储中分配。当封闭方法退出时,此框将自动回收,并且可能早于编译器发现不再需要它的时间。此框可以包含NSArray *类型的值。

键入时:

NSArray * monthsForChosenYear = [self monthsForYear:newChosenYear];

你要求两件事,它只是一个简写:

NSArray * monthsForChosenYear;
monthsForChosenYear = [self monthsForYear:newChosenYear];

,第二行调用方法并将返回的值存储在名为monthsForChosenYear的框中。最后当你输入:

[self setMonths: monthsForChosenYear];

存储在您的方框monthsForChosenYear中的值将传递给方法。如果您不再使用框monthsForChosenYear,编译器可能会回收它,或者它可能会等到封闭方法结束或其他一些合适的点。

编译器分析盒子的使用情况并进行优化,如果确定不需要盒子,有时他们甚至不会分配盒子。分配盒子的成本是无穷小的。

* [注意:实际上通常有两种本地方框。第二个,通常称为寄存器,其分配成本通常甚至小于无穷小。使用哪种框由编译器决定。] *

键入时:

[self setMonths: [self monthsForYear:newChosenYear]];

您要求在一行中调用两个方法,并且必须将内部调用([self monthsForYear:newChosenYear])返回的值传递给外部调用。编译器在哪里存储此结果?编译器实际上将上述内容转换为:

NSArray *compilerTemporaryBox = [self monthsForYear:newChosenYear];
[self setMonths:compilerTemporaryBox];

从上面你知道这是怎么回事。 编译器有一个小优点,因为它知道需要多长compilerTemporaryBox,所以它不需要弄清楚,但这不会影响编译代码。< / p>

所以,总的来说,无论你怎么写它都没关系。

此外,您使用的内存管理类型:MRC,ARC或GC;不会影响答案 - 编译器最终会同时处理你的变体。

所以请选择最适合自己的款式。 HTH。

答案 1 :(得分:1)

Clang几乎肯定足够聪明,可以将这两段代码编译成相同的结果机器代码。速度或内存问题没有区别。

答案 2 :(得分:0)

你在使用ARC吗?没有ARC,使用不错的优化器就没有区别,但是使用ARC可能会使用额外的保留/释放。