我在網上尋找優化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