2016-03-10 65 views
0

我想知道以下哪些佔據更多的內存枚舉內存使用

struct Constants 
{ 
    var age = 10 
} 

enum Constants 
{ 
    case age = 10 
} 

我也想知道在存儲器方面enum#define之間的差異。任何人都可以幫我嗎?

+2

你爲什麼不用'sizeof(Constants)'來檢查它? –

回答

2

A #define或多或少是您在定義中放置的文本的精確副本。這意味着如果#define包含一個代碼塊,那麼該塊將在每個使用定義值的地方編譯。

#define sqare_2 sqrt(2.0) 

將是一個糟糕的主意,因爲每次你會打電話sqare_2它實際上會調用sqrt功能,而不是記住結果。那麼,除非編譯時間優化,但我希望你得到的圖片。所以#define與內存無關,因爲它是編譯時指令,而不是運行時。

Swift中的枚舉是純粹的OOP,非常像一個類。它會添加很多方法,如rawValue這使得元素相當大,性能不好,可能會有額外的內存消耗,但可能不是每個實例。枚舉的工作方式就好像它只有靜態方法一樣,因此創建實例不應該使內存膨脹超過枚舉的原始值的類型。

一個結構會佔用您在其中定義的內存大小以及指針的內存,這些指針在小結構中代表大部分數據。許多這些指針和實際大小可能與Swift的實現不同。例如,如果語言支持混合,它通常意味着每個類或結構將包含指向其方法的函數的指針。如果是這樣的話,我們會希望寫入的每個方法都會將至少32或64位添加到對象的大小,這也適用於從超類接收的方法。而且由於一些方法已經存在,比如它總會佔用額外的內存。而且,由於新版本的添加,您可能會預期其大小會有所不同。

對不起,我沒有你的具體情況的答案,說哪個更大,它可能是你永遠找不到答案。但一般而言,物體的大小很難找到。例如,您可能會得到String的大小始終只是指針的大小。如果你打開它,雖然你可能會發現它有3個指針和3個整數的大小,但不管字符串的長度如何,大小都是恆定的。原因之一是指針的其中一個指針保存着實際的字符串數據,而其餘的指針則用於諸如編碼,長度等等。您可能會爭辯說,字符串顯然是實際文本數據的所有者,應該包括那些大小的數據,但那麼包裝的情況如何:UILabel的大小是否取決於文本長度?如果是這樣,當兩個標籤共享相同的文本時會發生什麼;那麼尺寸的總和將大於實際的內存消耗。