2014-10-01 63 views
2

我最近一直在使用Objective-C,並且來自C++世界,我沒有明確指出本地Objective-C集合的容量。在C++中,容器可以用對象或引用類型(例如引用包裝器或指針)填充,因此指定初始容量是有意義的,因爲爲一系列對象預先分配內存可以是性能大大提高。但是,在Objective-C中,集合只能包含對動態分配對象(即指針)的引用。因此,我想知道指定容量的性能優勢是什麼,如果在最壞的情況下只有指針集合的大小超過原始容量時才需要複製指針。Objective-C中的收集容量的要點是什麼?

很明顯,我對內存模型的理解還很缺乏,所以我錯過了什麼?

+3

是的,Objective-C的效果比C++的效果要小,因爲它只是指針。但是由於調整大小會影響性能關鍵代碼(如長循環)的性能,因此仍然存在不必要的內存分配/釋放/碎片/複製。 – fluidsonic 2014-10-01 01:16:58

+1

你可能是對的。這是一個小的優化,因爲如果集合需要變得更大,realloc和memcpy只是指針而不是對象。 – rmaddy 2014-10-01 01:17:16

+2

我懷疑指定初始容量的能力主要是因爲一些人認爲它有一些好處並要求它。 – 2014-10-01 01:21:27

回答

3

許多Cocoa方法在OS X的初始版本中實現,很可能早在OpenStep甚至NextStep中實現。這意味着他們可能在過去的25MHz摩托羅拉68030 32位處理器上最大化性能時發揮了重要作用。開始的程序員可能會被現代化的機器所破壞,其千兆字節的內存和處理器週期以千兆赫爲單位測量,但是老一代的程序員已經在機器上開發出許多高性能的應用程序,其數量比現在的機器少了數量級的內存,CPU功率和內存帶寬。通過提前分配所需的內存來節省數千個陣列添加的內存重新分配時間可能是非常有益的。

我很抱歉無法簡單地向OP的帖子添加評論,但我覺得傳統使用的想法需要一些額外的視角。檢查標題並注意何時開始使用特定方法是很好的,因爲它可能在過去具有重要意義。

更新:從我在網上找到的公開維護的NextStep開發人員文檔中,可以看到NSMutableArray -initWithCapacity:和+ arrayWithCapacity:至少早在1994年在NextStep 3.3中實現。