2014-08-28 200 views
4

我在网上寻找优化Objective-C代码的提示,并且遇到了this链接。在文章中我看到了下面的注释,这是我无法理解的。Objective-C中实例变量声明的顺序是否重要?

enter image description here

+3

是的,如果您仔细观察应用程序中每个类的规则,它将以0.02%的速度运行,并且可以减少0.03%的存储空间。 – 2014-08-28 19:23:50

+0

你能帮我一些链接,我可以阅读更多关于这个 – Tamil 2014-08-28 19:28:07

+1

这个链接应该帮助你。 http://c2.com/cgi/wiki?PrematureOptimization – CrimsonChris 2014-08-28 19:29:06

回答

2

这篇文章是过时的。正如存储结构的成员一样,ivars曾经存储在Objective-C实例中,因此内存对齐可能(稍微)影响访问时间。

然而,现在,ivars are indirectly accessed (at least in Apple's runtime);该实例现在保存了ivar的偏移,并使用它来访问该变量。由于所有这些偏移量都是相同的类型,并且您无法控制其他存储,所以这种对齐问题可以避免。

此外,明确的伊娃尔宣言已经由于引入声明的特性而不再使用。

+1

除非我错过了一些间接寻找伊娃偏移的介绍对伊娃布局没有影响。另外,存储偏移量的变量不是实例的一部分 - 实例仍然只包含实际的ivars。偏移是在链接时计算的,间接解决了脆弱的基类问题(请参考答案中的链接)。 – CRD 2014-08-28 20:58:34

+0

它肯定不会是我第一次错误,@CRD,但每次阅读那篇文章时,我都明白偏移确实是实例的一部分。我很乐意看到与此相矛盾的信息,所以我的理解更好。 – 2014-11-13 21:21:43

+1

如果偏移量存储在实例中,它肯定会将另一个问题替换为另一个问题 - 您如何为新的基类实例变量添加偏移量?通过观察,偏移量以全局变量形式存储,其名称由类+实例变量名构建。典型的实例变量访问然后是来自全局+加载/存储(实例指针+偏移量)的加载偏移量。我不知道观察到的内容是否公开记录,但我认为这样做的理论原因可以保持,不管细节如何。 – CRD 2014-11-15 16:43:10

2

ivars的布局由Objective-C编译器决定,并且在语言中没有提供控制来实现此目的。虽然您阅读的文章在特定编译器的某个时间点可能是正确的,但它报告的是您不能依赖的特定于实现的详细信息。

相信编译器做得不错;或者如果布局对您来说很重要,请使用C或其他可以控制布局的语言。