Swift中枚舉類型的內存佔用

Swift中的枚舉有關聯值。不一樣枚舉成員能夠有不一樣類型的關聯值。bash

enum TestEnum {
    case test0(a:Int,b:Int,c:Int)
    case test1(a:Int,b:Int)
    case test2(a:Bool)
    case test3
}
複製代碼

上邊示例的枚舉中有四個成員,其中前三個成員都關聯有不一樣類型和個數的關聯值。能夠經過如下方法來看TestEnum類型的內存實際佔用內存分配ide

print("TestEnum類型的內存佔用:" + "\(MemoryLayout<TestEnum>.size)")
///TestEnum類型的內存佔用:25  
print("TestEnum類型的內存分配:" + "\(MemoryLayout<TestEnum>.stride)")
///TestEnum類型的內存分配:32
print("TestEnum類型的內存對齊:" + "\(MemoryLayout<TestEnum>.alignment)")
///TestEnum類型的內存對齊:8

複製代碼

單獨看一個TestEnum類型的變量的內存佔用和分配佈局

經過看枚舉變量的內存地址來看內存裏的數據是怎麼存儲的

斷點調試右鍵要看的變量,點擊如圖選項進入:

看到圖中紅色圈出部分是 t0變量關聯值的存儲方式,3個關聯值每一個都佔用8個字節。

0A 00 00 00 00 00 00 00 //10
0B 00 00 00 00 00 00 00 //11
0C 00 00 00 00 00 00 00 //12
00 00 00 00 00 00 00 00 //成員值的存儲0
複製代碼

注意:蘋果的地址是小端模式。咱們看到的是0A 00 00 00 00 00 00 00,實際讀取的是00 00 00 00 00 00 00 0A。ui

On 32-bit platforms, Int is the same size as Int32, and on 64-bit platforms, Int is the same size as Int64. (在64位的機器中Int的size和Int64同樣,64bit,8個字節)spa

前24個字節能夠看出是3個關聯值的內存,能夠經過看其它成員值的內存佈局來檢查下第25個字節的用途。3d

能夠看出第25個字節是用來標識是枚舉類型的第幾個成員值。t0是0,t1是1,t2是2,t3是3。

總結: 枚舉類型變量的內存佔用能夠解釋爲1個字節存儲成員值(標明是哪一個成員),加上佔用字節數最大的關聯值的字節數。例如上邊是(24 + 1),又因爲內存對齊的原則,實際上分配的是32個字節。調試

若是沒有關聯值的話,那麼內存只須要一個字節來存儲是哪一個成員就夠了。以下: code

相關文章
相關標籤/搜索