回答
这篇文章是过时的。正如存储结构的成员一样,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. php检查是否声明了实例变量但未分配实例变量
- 2. 实例变量声明
- 3. .h实例变量声明
- 4. 使用obj-c中的属性,我们是否需要声明实例变量?
- 5. readonly变量声明的顺序是否保证了值的设置顺序?
- 6. 实例变量是否可以在类的底部声明?
- 7. 在哪里放置变量的声明是否重要?
- 8. 变量定义中关键字的顺序是否重要?
- 9. 是否有可能将数组声明为实例变量?
- 10. 实例变量声明的放置
- 11. 通过继承重新声明或覆盖实例变量是否有效?
- 12. 将IBOutlet放入实例变量声明或@property声明中?
- 13. C++:变量声明初始化顺序
- 14. 当做==和===比较时,变量的顺序是否重要?
- 15. ComponentScan顺序是否重要?
- 16. 实例变量声明错误?
- 17. 声明验证阻止实例变量
- 18. 差异如何声明实例变量
- 19. 实例变量声明语法
- 20. 属性和实例变量声明
- 21. XAML ItemsSource和SelectedItem绑定声明顺序确实很重要吧?
- 22. 我是否在ObjC的.h文件中声明了所有的实例变量?
- 23. 表中的列顺序是否重要?
- 24. 是否必须将属性声明为Objective C中的实例变量?
- 25. Objective C实例变量/属性的多重声明
- 26. 全局变量实例化的顺序
- 27. 实例化被声明为实例变量的ArrayList
- 28. 非法实例声明/重叠实例
- 29. CUDA:线程中的变量声明 - 是否有重叠?
- 30. 在ObjC实现文件中声明的实例变量
是的,如果您仔细观察应用程序中每个类的规则,它将以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