我在网上寻找优化Objective-C代码的提示,并且遇到了this链接。在文章中我看到了下面的注释,这是我无法理解的。Objective-C中实例变量声明的顺序是否重要?
回答
这篇文章是过时的。正如存储结构的成员一样,ivars曾经存储在Objective-C实例中,因此内存对齐可能(稍微)影响访问时间。
然而,现在,ivars are indirectly accessed (at least in Apple's runtime);该实例现在保存了ivar的偏移,并使用它来访问该变量。由于所有这些偏移量都是相同的类型,并且您无法控制其他存储,所以这种对齐问题可以避免。
此外,明确的伊娃尔宣言已经由于引入声明的特性而不再使用。
除非我错过了一些间接寻找伊娃偏移的介绍对伊娃布局没有影响。另外,存储偏移量的变量不是实例的一部分 - 实例仍然只包含实际的ivars。偏移是在链接时计算的,间接解决了脆弱的基类问题(请参考答案中的链接)。 – CRD 2014-08-28 20:58:34
它肯定不会是我第一次错误,@CRD,但每次阅读那篇文章时,我都明白偏移确实是实例的一部分。我很乐意看到与此相矛盾的信息,所以我的理解更好。 – 2014-11-13 21:21:43
如果偏移量存储在实例中,它肯定会将另一个问题替换为另一个问题 - 您如何为新的基类实例变量添加偏移量?通过观察,偏移量以全局变量形式存储,其名称由类+实例变量名构建。典型的实例变量访问然后是来自全局+加载/存储(实例指针+偏移量)的加载偏移量。我不知道观察到的内容是否公开记录,但我认为这样做的理论原因可以保持,不管细节如何。 – CRD 2014-11-15 16:43:10
ivars的布局由Objective-C编译器决定,并且在语言中没有提供控制来实现此目的。虽然您阅读的文章在特定编译器的某个时间点可能是正确的,但它报告的是您不能依赖的特定于实现的详细信息。
相信编译器做得不错;或者如果布局对您来说很重要,请使用C或其他可以控制布局的语言。
- 1. 使用obj-c中的属性,我们是否需要声明实例变量?
- 2. readonly变量声明的顺序是否保证了值的设置顺序?
- 3. 实例变量是否可以在类的底部声明?
- 4. 变量定义中关键字的顺序是否重要?
- 5. 实例变量声明的放置
- 6. C++:变量声明初始化顺序
- 7. 将IBOutlet放入实例变量声明或@property声明中?
- 8. 通过继承重新声明或覆盖实例变量是否有效?
- 9. 差异如何声明实例变量
- 10. 属性和实例变量声明
- 11. 声明验证阻止实例变量
- 12. XAML ItemsSource和SelectedItem绑定声明顺序确实很重要吧?
- 13. 我是否在ObjC的.h文件中声明了所有的实例变量?
- 14. 是否必须将属性声明为Objective C中的实例变量?
- 15. 表中的列顺序是否重要?
- 16. 全局变量实例化的顺序
- 17. 非法实例声明/重叠实例
- 18. 我们是否需要在类中声明变量?
- 19. 重构实例声明中的方法
- 20. 声明变量不是在用我要声明Postgres里变量的Postgres
- 21. 实例化没有变量声明的对象是否有任何缺点?
- 22. 是多么重要声明正确的变量类型
- 23. 指数的顺序是否重要?
- 24. Sqoop命令的顺序是否重要?
- 25. CSS样式的顺序是否重要?
- 26. 虚拟表的顺序是否重要?
- 27. 是否有任何目的来重新声明JavaScript变量?
- 28. 重新声明变量
- 29. 碳多重变量声明
- 30. 如何排序声明变量的顺序
是的,如果您仔细观察应用程序中每个类的规则,它将以0.02%的速度运行,并且可以减少0.03%的存储空间。 – 2014-08-28 19:23:50
你能帮我一些链接,我可以阅读更多关于这个 – Tamil 2014-08-28 19:28:07
这个链接应该帮助你。 http://c2.com/cgi/wiki?PrematureOptimization – CrimsonChris 2014-08-28 19:29:06