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