在Objective-C中,实例变量声明的顺序是否重要?

4
我正在搜索优化Objective-C代码的技巧,偶然发现了this链接。在文章中,我看到了下面的注释,但我无法理解。

enter image description here


3
如果您在应用程序中的每个类中仔细遵守这些规则,那么它将运行得更快(速度提高 0.02%)并且需要更少的存储空间(减少 0.03%)。 - Hot Licks
你能帮我提供一些相关链接,让我可以了解更多关于这个的内容吗? - Tamil
1
这个链接应该会对你有所帮助。http://c2.com/cgi/wiki?PrematureOptimization - CrimsonChris
3
还有人在 Obj-C 中使用实例变量吗?我认为大多数人都在使用属性... 如果字节对齐对您有用,那就使用纯 C,因为 Obj-C 的开销本身就比字节对齐更成问题。 - Sulthan
2个回答

2

ivars的布局由Objective-C编译器确定,语言本身没有提供影响它的控制。虽然你读过的文章可能在某个特定编译器的某个时间点上是正确的,但它报告的是实现特定的细节,你不能依赖它。

相信编译器会做好工作;或者如果布局对你很重要,请使用C或其他提供布局控制的语言。


2
这篇文章已经过时了。曾经,ivars(实例变量)被存储在Objective-C实例中,就像结构体的成员一样存储,因此内存对齐可能会(稍微)影响访问时间。
然而,现在,ivars 间接访问(至少在苹果的运行时中); 实例现在保存ivar的偏移量,并使用它来访问变量。由于所有这些偏移量都是相同类型的,并且您无法控制其他存储,因此这个对齐问题已经消除了。
此外,随着声明属性的引入,显式ivars声明已经不再常见。

1
除非我漏掉了什么,否则引入间接寻址来查找ivar的偏移量对ivar布局没有影响。存储偏移量的变量也不是实例的一部分 - 实例仍然只包含实际的ivar。偏移量在链接时计算,间接寻址解决了脆弱基类问题(请参阅答案中的链接)。 - CRD
这肯定不是我第一次错了,@CRD,但每次我阅读那篇文章时,我都会理解偏移量确实是实例的一部分。如果有信息与此相矛盾,我会很高兴看到它,以便更好地理解。 - jscs
1
如果偏移量存储在实例中,那肯定只是把一个问题替换成了另一个问题 - 如何为新的基类实例变量添加偏移量?观察发现,这些偏移量存储在全局变量中,名称由类和实例变量名称构成。典型的实例变量访问是从全局加载偏移量 + 加载/存储(实例指针 + 偏移量)。我不知道所观察到的是否公开记录,但我认为无论细节如何,采用这种方式的理论原因是成立的。 - CRD

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