2014-08-28 206 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或其他可以控制佈局的語言。