Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic...

107

Transcript of Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic...

Page 1: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM
Page 2: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM
Page 3: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Swift Memory LayoutMike Ash

GOTO Copenhagen 2016

💤👌🎃🌈🗝📛🔕

Page 4: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

About Memikeash.com plausible.coop NSBlog github.com/mikeash @mikeash

PHOTO

Page 5: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

• What even is memory?

• Memory dumper program

• How Swift lays out data

Page 6: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Memory

Page 7: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Memory

Page 8: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

MemoryVacuum tubes Mercury (or gin) delay line

Magnetic coreDRAM

Page 9: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Memory1 0

1 0 1 0 1 0 1 0

AA 1C 00 F8 ……….

Page 10: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Memory

AA 1C 00 F8 ……….

0 1 2 3 ……

Page 11: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Memory

01AA2C5EFF001101

0000000000000000

00000000000000FF

A0F31C228A177013...

081624…

Page 12: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Memory

01AA2C5EFF001101

0000000000000000

00000000000000FF

A0F31C228A177013...

00000000000000000000000000000008

00000000000000100000000000000018

Page 13: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

01AA2C5EFF001101

0000000000000000

00000000000000FF

A0F31C228A177013...

00000001000000000000000100000008

00000001000000100000000100000018

.

.

.

Memory…

Page 14: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Memory - Big Picture0000000000000000

0000000100000000

00007FFFFFFFFFFF

FFFF800000000000

FFFFFFFFFFFFFFFF

NO

T TO

SC

ALE

Page 15: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

01AA2C5EFF001101

0000000000000000

00000000000000FF

00000001000AE780...

00000001000000000000000100000008

00000001000000100000000100000018

.

.

.

Memory…

A0F31C228A177013

001101FFAE73800000000001000AE780

Page 16: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

01AA2C5EFF001101

0000000000000000

00000000000000FF

00000001000AE780...

00000001000000000000000100000008

00000001000000100000000100000018

.

.

.

Memory…

A0F31C228A177013

001101FFAE73800000000001000AE780

Page 17: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

01AA2C5EFF001101

0000000000000000

00000000000000FF

80E70A0001000000...

00000001000000000000000100000008

00000001000000100000000100000018

.

.

.

Memory…

A0F31C228A177013

001101FFAE73800000000001000AE780

Page 18: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

MemoryStack Heap

Global Data

var x = …var y = …var z = x + ylet string = view.textlet text = view.stringlet count = array.count

UIView()NSObject()MyClass()YourClass()TheirClass()

malloc/free

"string constants""more string constants"class MyClass {}struct MyStruct {}protocol MyProtocol {}

Page 19: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Dumping Memoryvar x = ...bytes(of: &x)

func bytes<T>(of value: T) -> [UInt8] { ...}

Page 20: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Dumping Memory

https://github.com/mikeash/memorydumper2

http://tinyurl.com/swmem

http://www.www.reallyhugeurl.com/index.php/freak=no5zyn3o&ego.y=0p0iyjmf&lol=td2g2qxx&oed=gojsz0bh&oed=fheq2iqt&ego.x=g1c2s5daxsjkjhf&ssn=7kegc1kllfo1r0a&eat=qe4zk8hgmzvl827&oedeldritch=9qtni82cz8omnzk1x13twrw1qohhuhkrbuzr06q

8ya1evomdpsaglggcyhde4ksr5

Page 21: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Dumping Memory

Xcode 8

Swift 3

Page 22: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Dumping Memoryvar x = ...bytes(of: &x)

func bytes<T>(of value: T) -> [UInt8] { ...}

Page 23: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Dumping Memoryfunc bytes<T>(of value: T) -> [UInt8] { var value = value let size = MemoryLayout<T>.size return withUnsafePointer(to: &value, { $0.withMemoryRebound( to: UInt8.self, capacity: size, { Array(UnsafeBufferPointer( start: $0, count: size)) }) })}

Page 24: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Dumping Memory

let x = 0x0102030405060708print(bytes(of: x))print(bytes(of: 42))

[8, 7, 6, 5, 4, 3, 2, 1][42, 0, 0, 0, 0, 0, 0, 0]

Page 25: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Dumping Memoryfunc hexString<Seq: Sequence> (bytes: Seq, limit: Int? = nil, separator: String = " ") -> Stringwhere Seq.Iterator.Element == UInt8 { let spacesInterval = 8 var result = "" for (index, byte) in bytes.enumerated() { if let limit = limit, index >= limit { result.append("...") break } if index > 0 && index % spacesInterval == 0 { result.append(separator) } result.append(String(format: "%02x", byte)) } return result}

Page 26: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Dumping Memory

let x = 0x0102030405060708print(hexString(bytes: bytes(of: x)))print(hexString(bytes: bytes(of: 42)))

08070605040302012a00000000000000

Page 27: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Dumping Memorylet x = ...

0102030405060708...

Page 28: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Dumping Memorylet x = ...

0102030405060708...

a80148fbc9a100e0... 0081ff63abccffff...

00001fff78abcfff...

Page 29: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Pointers are Integers

struct Pointer { var address: UInt}

Page 30: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Pointers are Integers

buffer.withUnsafeBufferPointer({ bufferPointer in return bufferPointer.baseAddress?.withMemoryRebound( to: Pointer.self, capacity: bufferPointer.count / MemoryLayout<Pointer>.size, { let castBufferPointer = UnsafeBufferPointer( start: $0, count: bufferPointer.count / MemoryLayout<Pointer>.size) return Array(castBufferPointer) }) ?? [] })

Page 31: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Dumping Memory4200000000000000 900400cce67f0000 800300cce67f0000 400100cce67f0000

0x0000000000000042

0x00007fe6cc000490

0x00007fe6cc000380

0x00007fe6cc000140

Page 32: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Bad Pointers4200000000000000 900400cce67f0000 800300cce67f0000 400100cce67f0000

0x0000000000000042

0x00007fe6cc000490

0x00007fe6cc000380

0x00007fe6cc000140

………… ………… …………💥

Page 33: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Bad Pointersmach_vm_read_overwrite

Copy N bytes from X to Y

Similar to memcpy

Returns an error on invalid pointers

Page 34: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Bad Pointers

public func mach_vm_read_overwrite( _ target_task: vm_map_t, _ address: mach_vm_address_t, _ size: mach_vm_size_t, _ data: mach_vm_address_t, _ outsize: UnsafeMutablePointer<mach_vm_size_t>!) -> kern_return_t

Page 35: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Safe Readsfunc safeRead(ptr: Pointer, into: inout [UInt8]) -> Bool { let result = into.withUnsafeMutableBufferPointer( { bufferPointer -> kern_return_t in var outSize: mach_vm_size_t = 0 return mach_vm_read_overwrite( mach_task_self_, mach_vm_address_t(ptr), mach_vm_size_t(bufferPointer.count), mach_vm_address_t(bufferPointer.baseAddress), &outSize) }) return result == KERN_SUCCESS}

Page 36: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

How Much to Read?Initial value: MemoryLayout<T>.size

Heap allocations: malloc_size

Code and Globals: scan with dladdrBonus: dladdr also gives names

Page 37: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Name Mangling_TFCs23_ContiguousArrayStorage32_getNonVerbatimBridgedHeapBufferfT_GVs11_HeapBufferSiPs9AnyObject__

➜ swift-demangle ➜

Swift._ContiguousArrayStorage._getNonVerbatimBridgedHeapBuffer () -> Swift._HeapBuffer<Swift.Int, Swift.AnyObject>

Page 38: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Strings

let lowerBound: UInt8 = 32let upperBound: UInt8 = 126 let pieces = buffer.split(whereSeparator: { !(lowerBound ... upperBound ~= $0) })let sufficientlyLongPieces = pieces.filter( { $0.count >= 4 })return sufficientlyLongPieces.map( { String(bytes: $0, encoding: .utf8)! })

Search for printable ASCII at least 4 characters long

Page 39: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Outputlet x = …

0102030405060708...

a80148fbc9a100e0... 0081ff63abccffff...

00001fff78abcfff...

Page 40: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Graphviz_100c001a0 [label="malloc 0x100c001a0 (16 bytes)404fc00001000000303ec00001000000"]_100c001a0 -> _100c04f40 [label="@0"]_100c001a0 -> _100c03e30 [label="@8"]_100c033f0 [label="malloc 0x100c033f0 (16 bytes)404fc000010000001a000c1000000020"]_100c033f0 -> _100c04f40 [label="@0"]_100c03e30 [label="malloc 0x100c03e30 (16 bytes)536f6d657468696e670048656c6c6f21Strings:SomethingHello!"]

Page 41: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Output

malloc 0x100c001a0 (16 bytes)404fc00001000000303ec00001000000

malloc 0x100c04f40 (16 bytes)4c6561662068657265000c10000000f0

Strings:Leaf here

@0

malloc 0x100c03e30 (16 bytes)536f6d657468696e670048656c6c6f21

Strings:Something

Hello!

@8

malloc 0x100c033f0 (16 bytes)404fc000010000001a000c1000000020

@0

malloc 0x100c02d80 (16 bytes)f033c00001000000a001c00001000000

@8 @0

unknown 0x7fff5fbff260 (8 bytes)802dc00001000000

@0

Page 42: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Memory Layouts

• Arch-specific (these are x86-64)

• Swift stuff depends on the compiler version

• Offsets, sizes, contents, meaning subject to change

• Still useful for debugging, general knowledge of how things work

Page 43: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

C structs struct S { long x; long y; long z; }; S s = { 1, 2, 3 };

unknown 0x7fff5fbff2a0 (24 bytes)010000000000000002000000000000000300000000000000

Page 44: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

C structs struct WithPadding { char a; char b; char c; short d; char e; int f; char g; long h; }; WithPadding withPadding = { 1, 2, 3, 4, 5, 6, 7, 8 };

unknown 0x7fff5fbff288 (24 bytes)010203000400050006000000070000000800000000000000

Page 45: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

C++ classes class SimpleClass { public: long x; virtual void f() {} virtual void g() {} virtual void h() {} }; SimpleClass simpleClass; simpleClass.x = 1;

Page 46: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

C++ classes

DumpCMemory::SimpleClass::h() 0x100001a10 (16 bytes)554889e548897df85dc3660f1f440000

unknown 0x7fff5fbff250 (16 bytes)20d53900010000000100000000000000

vtable for DumpCMemory::SimpleClass 0x10039d520 (24 bytes)f019000001000000001a000001000000101a000001000000

@0

@16

DumpCMemory::SimpleClass::f() 0x1000019f0 (16 bytes)554889e548897df85dc3660f1f440000

@0

DumpCMemory::SimpleClass::g() 0x100001a00 (16 bytes)554889e548897df85dc3660f1f440000

@8

Page 47: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

C++ classes

DumpCMemory::SimpleClass::h() 0x100001a10 (16 bytes)554889e548897df85dc3660f1f440000

unknown 0x7fff5fbff250 (16 bytes)20d53900010000000100000000000000

vtable for DumpCMemory::SimpleClass 0x10039d520 (24 bytes)f019000001000000001a000001000000101a000001000000

@0

@16

DumpCMemory::SimpleClass::f() 0x1000019f0 (16 bytes)554889e548897df85dc3660f1f440000

@0

DumpCMemory::SimpleClass::g() 0x100001a00 (16 bytes)554889e548897df85dc3660f1f440000

@8

Page 48: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

C++ classes class SimpleSubclass: public SimpleClass { public: long y; virtual void i() {} virtual void j() {} }; SimpleSubclass simpleSubclass; simpleSubclass.x = 1; simpleSubclass.y = 2;

Page 49: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

C++ classes

DumpCMemory::SimpleSubclass::j() 0x100001a70 (16 bytes)554889e548897df85dc3660f1f440000

unknown 0x7fff5fbff238 (24 bytes)58d539000100000001000000000000000200000000000000

vtable for DumpCMemory::SimpleSubclass 0x10039d558 (40 bytes)f019000001000000001a000001000000101a000001000000601a000001000000701a000001000000

@0

@32

DumpCMemory::SimpleClass::g() 0x100001a00 (16 bytes)554889e548897df85dc3660f1f440000

@8

DumpCMemory::SimpleClass::f() 0x1000019f0 (16 bytes)554889e548897df85dc3660f1f440000

@0

DumpCMemory::SimpleClass::h() 0x100001a10 (16 bytes)554889e548897df85dc3660f1f440000

@16

DumpCMemory::SimpleSubclass::i() 0x100001a60 (16 bytes)554889e548897df85dc3660f1f440000

@24

Page 50: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

C++ classes

DumpCMemory::SimpleSubclass::j() 0x100001a70 (16 bytes)554889e548897df85dc3660f1f440000

unknown 0x7fff5fbff238 (24 bytes)58d539000100000001000000000000000200000000000000

vtable for DumpCMemory::SimpleSubclass 0x10039d558 (40 bytes)f019000001000000001a000001000000101a000001000000601a000001000000701a000001000000

@0

@32

DumpCMemory::SimpleClass::g() 0x100001a00 (16 bytes)554889e548897df85dc3660f1f440000

@8

DumpCMemory::SimpleClass::f() 0x1000019f0 (16 bytes)554889e548897df85dc3660f1f440000

@0

DumpCMemory::SimpleClass::h() 0x100001a10 (16 bytes)554889e548897df85dc3660f1f440000

@16

DumpCMemory::SimpleSubclass::i() 0x100001a60 (16 bytes)554889e548897df85dc3660f1f440000

@24

Page 51: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

C++ classes

class SecondSuperclass { public: long y; virtual void k() {} virtual void l() {} };

Page 52: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

C++ classes class MultipleInheritanceSubclass: public SimpleClass, SecondSuperclass { public: long z; }; MultipleInheritanceSubclass multipleInheritanceSubclass; multipleInheritanceSubclass.x = 1; multipleInheritanceSubclass.y = 2; multipleInheritanceSubclass.z = 3;

Page 53: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

C++ classes

__cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const 0x7fff8952c4da (292 bytes)554889e54157415641554154534883ec284589ce448945d448894dc8488955c04889f34989fd488b43104584f67416498b7d08488b7008e8

2e0a000085c0750e...Strings:

AWAVAUATSH([A\A]A^A_]([A\A]A^A_]

typeinfo for DumpCMemory::MultipleInheritanceSubclass 0x10039d5f0 (56 bytes)98bc4778ff7f0000

10ad340001000000000000000200000038d53900010000000200000000000000e0d53900010000000010000000000000

vtable for __cxxabiv1::__vmi_class_type_info 0x7fff7847bc98 (72 bytes)c8b45289ff7f0000ceb45289ff7f0000ceb35289ff7f0000d0b35289ff7f00007ab55289ff7f0000dac45289ff7f0000e2bf5289ff7f0000

74b75289ff7f0000...

@0

typeinfo name for DumpCMemory::MultipleInheritanceSubclass 0x10034ad10 (48 bytes)5a313144756d70434d656d6f72794532374d756c7469706c65496e6865726974616e6365537562636c61737300000000

Strings:Z11DumpCMemoryE27MultipleInheritanceSubclass

@8

typeinfo for DumpCMemory::SimpleClass 0x10039d538 (16 bytes)b8bb4778ff7f0000d0ac340001000000

@24

typeinfo for DumpCMemory::SecondSuperclass 0x10039d5e0 (16 bytes)b8bb4778ff7f0000

40ad340001000000

@40

@40

__cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const 0x7fff8952b57a (178 bytes)554889e54156534883ec504989d64889fbb0014839f30f848d0000004889f7e88e0000004885c0747e488945a048c745a80000000048895db048c745b8ffffff...

Strings:AVSHP[A^]

@32

__cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info() 0x7fff8952b4c8 (6 bytes)e9a517000090

@0

__cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info() 0x7fff8952b4ce (28 bytes)554889e553504889fbe8961700004889df4883c4085b5de9

76190000

@8

__cxxabiv1::__shim_type_info::noop1() const 0x7fff8952b3ce (2 bytes)c390

@16

__cxxabiv1::__shim_type_info::noop2() const 0x7fff8952b3d0 (2 bytes)c390

@24

__cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const 0x7fff8952bfe2 (656 bytes)554889e54157415641554154534883ec184589c5894dd44989d74989f64889fb498b46104584ed74304c8b6308488b70084c89e7e8290f00

0085c00f84990000...Strings:

AWAVAUATSHt|I;

M9~ M9~(

[A\A]A^A_]

@48

__cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const 0x7fff8952b774 (196 bytes)554889e5415741564155415453504189ce4989d74989f44889fb493b5c2410744d488d7b18448b6b144c89e64c89fa4489f1e88bffffff49

83fd02727849c1e5...Strings:

AWAVAUATSPAI;\$

D$ HD$<A|$ Et$0At$0H

[A\A]A^A_]

@56

vtable for __cxxabiv1::__class_type_info 0x7fff7847bbb8 (72 bytes)78b45289ff7f00007eb45289ff7f0000ceb35289ff7f0000d0b35289ff7f00007ab55289ff7f000082c65289ff7f000032c45289ff7f0000

acb65289ff7f0000...

@0

typeinfo name for DumpCMemory::SimpleClass 0x10034acd0 (32 bytes)5a313144756d70434d656d6f727945313153696d706c65436c61737300000000

Strings:Z11DumpCMemoryE11SimpleClass

@8 @0

typeinfo name for DumpCMemory::SecondSuperclass 0x10034ad40 (112 bytes)5a313144756d70434d656d6f72794531365365636f6e645375706572636c6173730000000000000000000000000000000056534337646c5f

696e666f00000000...Strings:

Z11DumpCMemoryE16SecondSuperclassVSC7dl_info

dli_fnamedli_fbasedli_snamedli_saddr

@8

@32

__cxxabiv1::__class_type_info::~__class_type_info() 0x7fff8952b47e (28 bytes)554889e553504889fbe8e61700004889df4883c4085b5de9

c6190000

@8

__cxxabiv1::__class_type_info::~__class_type_info() 0x7fff8952b478 (6 bytes)e9f517000090

@0

__cxxabiv1::__class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const 0x7fff8952b6ac (62 bytes)483b7e107537488b46204885c074154839d0741fff463cc7

463002000000c6464e01eb1948895620894e30c7463c01000000c3837e300275

04894e30c3c3

@56@16@24

__cxxabiv1::__class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const 0x7fff8952c682 (90 bytes)554889e5415741564154534589c64989cf4989d44889f3488b43104584c97413488b7f08488b7008e89508000085c07507eb0e4839c77409

5b415c415e415f5d...Strings:

AWAVATSE[A\A^A_][A\A^A_]

@40

__cxxabiv1::__class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const 0x7fff8952c432 (168 bytes)554889e5415741564154534189ce4989d74889f3488b43104584c074294c8b6708488b70084c89e7e8e50a000085c0744f488b03488b7008

4c89e7e8d20a0000...Strings:

AWAVATSAt5H;;uOL9{ t<L9{(t6D

[A\A^A_]

@48

unknown 0x7fff5fbff210 (40 bytes)a8d53900010000000100000000000000d0d539000100000030000000000000000200000000000000

vtable for DumpCMemory::MultipleInheritanceSubclass 0x10039d5a8 (56 bytes)f019000001000000001a000001000000101a000001000000

f0fffffffffffffff0d5390001000000001b000001000000101b000001000000

@0

vtable for DumpCMemory::MultipleInheritanceSubclass 0x10039d5d0 (16 bytes)001b000001000000101b000001000000

@16

@32

DumpCMemory::SecondSuperclass::k() 0x100001b00 (16 bytes)554889e548897df85dc3660f1f440000

@40

DumpCMemory::SimpleClass::f() 0x1000019f0 (16 bytes)554889e548897df85dc3660f1f440000

@0

DumpCMemory::SecondSuperclass::l() 0x100001b10 (16 bytes)554889e548897df85dc3909090909090

@48

DumpCMemory::SimpleClass::g() 0x100001a00 (16 bytes)554889e548897df85dc3660f1f440000

@8

DumpCMemory::SimpleClass::h() 0x100001a10 (16 bytes)554889e548897df85dc3660f1f440000

@16@0@8

Page 54: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

C++ classes

__cxxabiv1::__vmi_class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const 0x7fff8952c4da (292 bytes)554889e54157415641554154534883ec284589ce448945d448894dc8488955c04889f34989fd488b43104584f67416498b7d08488b7008e8

2e0a000085c0750e...Strings:

AWAVAUATSH([A\A]A^A_]([A\A]A^A_]

typeinfo for DumpCMemory::MultipleInheritanceSubclass 0x10039d5f0 (56 bytes)98bc4778ff7f000010ad340001000000000000000200000038d53900010000000200000000000000e0d53900010000000210000000000000

vtable for __cxxabiv1::__vmi_class_type_info 0x7fff7847bc98 (72 bytes)c8b45289ff7f0000ceb45289ff7f0000ceb35289ff7f0000d0b35289ff7f00007ab55289ff7f0000dac45289ff7f0000e2bf5289ff7f0000

74b75289ff7f0000...

@0

typeinfo name for DumpCMemory::MultipleInheritanceSubclass 0x10034ad10 (48 bytes)5a313144756d70434d656d6f72794532374d756c7469706c65496e6865726974616e6365537562636c61737300000000

Strings:Z11DumpCMemoryE27MultipleInheritanceSubclass

@8

typeinfo for DumpCMemory::SimpleClass 0x10039d538 (16 bytes)b8bb4778ff7f0000d0ac340001000000

@24

typeinfo for DumpCMemory::SecondSuperclass 0x10039d5e0 (16 bytes)b8bb4778ff7f000040ad340001000000

@40

@40

__cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const 0x7fff8952b57a (178 bytes)554889e54156534883ec504989d64889fbb0014839f30f848d0000004889f7e88e0000004885c0747e488945a048c745a80000000048895db048c745b8ffffff...

Strings:AVSHP[A^]

@32

__cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info() 0x7fff8952b4c8 (6 bytes)e9a517000090

@0

__cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info() 0x7fff8952b4ce (28 bytes)554889e553504889fbe8961700004889df4883c4085b5de9

76190000

@8

__cxxabiv1::__shim_type_info::noop1() const 0x7fff8952b3ce (2 bytes)c390

@16

__cxxabiv1::__shim_type_info::noop2() const 0x7fff8952b3d0 (2 bytes)c390

@24

__cxxabiv1::__vmi_class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const 0x7fff8952bfe2 (656 bytes)554889e54157415641554154534883ec184589c5894dd44989d74989f64889fb498b46104584ed74304c8b6308488b70084c89e7e8290f00

0085c00f84990000...Strings:

AWAVAUATSHt|I;

M9~ M9~(

[A\A]A^A_]

@48

__cxxabiv1::__vmi_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const 0x7fff8952b774 (196 bytes)554889e5415741564155415453504189ce4989d74989f44889fb493b5c2410744d488d7b18448b6b144c89e64c89fa4489f1e88bffffff49

83fd02727849c1e5...Strings:

AWAVAUATSPAI;\$

D$ HD$<A

|$ Et$0At$0H

[A\A]A^A_]

@56

vtable for __cxxabiv1::__class_type_info 0x7fff7847bbb8 (72 bytes)78b45289ff7f00007eb45289ff7f0000ceb35289ff7f0000d0b35289ff7f00007ab55289ff7f000082c65289ff7f000032c45289ff7f0000

acb65289ff7f0000...

@0

typeinfo name for DumpCMemory::SimpleClass 0x10034acd0 (32 bytes)5a313144756d70434d656d6f727945313153696d706c65436c61737300000000

Strings:Z11DumpCMemoryE11SimpleClass

@8 @0

typeinfo name for DumpCMemory::SecondSuperclass 0x10034ad40 (112 bytes)5a313144756d70434d656d6f72794531365365636f6e645375706572636c6173730000000000000000000000000000000056534337646c5f

696e666f00000000...Strings:

Z11DumpCMemoryE16SecondSuperclassVSC7dl_info

dli_fnamedli_fbasedli_snamedli_saddr

@8

@32

__cxxabiv1::__class_type_info::~__class_type_info() 0x7fff8952b47e (28 bytes)554889e553504889fbe8e61700004889df4883c4085b5de9

c6190000

@8

__cxxabiv1::__class_type_info::~__class_type_info() 0x7fff8952b478 (6 bytes)e9f517000090

@0

__cxxabiv1::__class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const 0x7fff8952b6ac (62 bytes)483b7e107537488b46204885c074154839d0741fff463cc7

463002000000c6464e01eb1948895620894e30c7463c01000000c3837e300275

04894e30c3c3

@56@16@24

__cxxabiv1::__class_type_info::search_above_dst(__cxxabiv1::__dynamic_cast_info*, void const*, void const*, int, bool) const 0x7fff8952c682 (90 bytes)554889e5415741564154534589c64989cf4989d44889f3488b43104584c97413488b7f08488b7008e89508000085c07507eb0e4839c77409

5b415c415e415f5d...Strings:

AWAVATSE[A\A^A_][A\A^A_]

@40

__cxxabiv1::__class_type_info::search_below_dst(__cxxabiv1::__dynamic_cast_info*, void const*, int, bool) const 0x7fff8952c432 (168 bytes)554889e5415741564154534189ce4989d74889f3488b43104584c074294c8b6708488b70084c89e7e8e50a000085c0744f488b03488b7008

4c89e7e8d20a0000...Strings:

AWAVATSAt5H;;uOL9{ t<L9{(t6D

[A\A^A_]

@48

unknown 0x7fff5fbff210 (40 bytes)a8d53900010000000100000000000000d0d539000100000002000000000000000300000000000000

vtable for DumpCMemory::MultipleInheritanceSubclass 0x10039d5a8 (56 bytes)f019000001000000001a000001000000101a000001000000

f0fffffffffffffff0d5390001000000001b000001000000101b000001000000

@0

vtable for DumpCMemory::MultipleInheritanceSubclass 0x10039d5d0 (16 bytes)001b000001000000101b000001000000

@16

@32

DumpCMemory::SecondSuperclass::k() 0x100001b00 (16 bytes)554889e548897df85dc3660f1f440000

@40

DumpCMemory::SimpleClass::f() 0x1000019f0 (16 bytes)554889e548897df85dc3660f1f440000

@0

DumpCMemory::SecondSuperclass::l() 0x100001b10 (16 bytes)554889e548897df85dc3909090909090

@48

DumpCMemory::SimpleClass::g() 0x100001a00 (16 bytes)554889e548897df85dc3660f1f440000

@8

DumpCMemory::SimpleClass::h() 0x100001a10 (16 bytes)554889e548897df85dc3660f1f440000

@16@0@8

Page 55: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Swift Typesstruct EmptyStruct {}

unknown 0x7fff5fbff2a0 (0 bytes)

Page 56: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Swift Typesstruct SimpleStruct { var x: Int = 1 var y: Int = 2 var z: Int = 3}

unknown 0x7fff5fbff2a0 (24 bytes)010000000000000002000000000000000300000000000000

Page 57: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Swift Typesstruct StructWithPadding { var a: UInt8 = 1 var b: UInt8 = 2 var c: UInt8 = 3 var d: UInt16 = 4 var e: UInt8 = 5 var f: UInt32 = 6 var g: UInt8 = 7 var h: UInt64 = 8}

unknown 0x7fff5fbff2a0 (24 bytes)0102035f0400050006000000077f00000800000000000000

Page 58: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Swift Types

class SimpleClass { var x: Int = 1 var y: Int = 2 var z: Int = 3}

Page 59: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Swift Types

unknown 0x100d050e5 (128 bytes)000000107c3c0001000000000000000000000000000000000000000000000000000000000000000000000000133d00010000000000000000

0000000000000000...

memorydumper2.SimpleClass.y.setter : Swift.Int 0x10000b910 (32 bytes)554889e548897df8488975f048897e185dc366666666662e0f1f840000000000

Strings:fffff.

memorydumper2.SimpleClass.z.getter : Swift.Int 0x10000b950 (16 bytes)554889e548897df8488b47205dc36690

OBJC_METACLASS_$_SwiftObject 0x1003d0c00 (40 bytes)000c3d0001000000d80b3d00010000006027d000010000000300000001000000c420d00001000000

@0

ObjC class SwiftObject 0x1003d0bd8 (40 bytes)000c3d00010000000000000000000000e00dff8cff7f0000

00000000000000002427d00001000000

@8

malloc 0x100d02760 (80 bytes)00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033dbb49bff7f0000

b0e2330001000000...

@16

unknown 0x100000003 (128 bytes)fe0700000103000080020000001900000058120000850021000000000019000000480000005f5f504147455a45524f000000000000000000

0000000000000000...Strings:

__PAGEZERO__TEXT

@24

unknown 0x100d020c4 (128 bytes)07000000d8d93c000100000000d53c00010000000000000000000000c0d93c000100000008c28e0001000000000000000000000000000000

0000000000000000...

@32

@0

_objc_empty_cache 0x7fff8cff0de0 (128 bytes)0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000...

@16

unknown 0x100d02724 (128 bytes)0000000010de3c000100000020da3c0001000000c8dd3c0001000000c0d93c000100000098c18e0001000000000000000000000000000000

0000000000000000...

@32

@72

CreateStringFromFileSystemRepresentationByAddingPercentEscapes.hexchars 0x7fff9bb4db33 (128 bytes)636c6173730069734b696e644f66436c6173733a0073657453656c6563743a00736574433a007365744d3a00736574466163746f723a0073

65744e756d4b6579...Strings:

classisKindOfClass:

setSelect:setC:setM:

setFactor:setNumKey:

setSeeds:setG:

setRankTable:setKeys2:

setKeyLen:setSubShare

@48

+[SwiftObject class] 0x10033e2b0 (16 bytes)4889f8c36666662e0f1f840000000000

Strings:fff.

@56

ObjC class memorydumper2.SimpleClass 0x1003d13b8 (184 bytes)80133d0001000000d80b3d0001000000e00dff8cff7f0000

0000000000000000e550d0000100000003000000000000002800000007000000

c800000010000000...

@32 @112 @128 @8

metaclass for memorydumper2.SimpleClass 0x1003d1380 (40 bytes)000c3d0001000000000c3d00010000002051d0000100000003000000010000008454d00001000000

@0

@16memorydumper2.SimpleClass.x.getter : Swift.Int 0x10000b8b0 (16 bytes)

554889e548897df8488b47105dc36690

@80

memorydumper2.SimpleClass.x.setter : Swift.Int 0x10000b8c0 (32 bytes)554889e548897df8488975f048897e105dc366666666662e0f1f840000000000

Strings:fffff.

@88

memorydumper2.SimpleClass.x.materializeForSet : Swift.Int 0x10000b8e0 (32 bytes)554889e54883c21031c089c14889d04889ca488975f848897df05dc30f1f4000

@96

memorydumper2.SimpleClass.y.getter : Swift.Int 0x10000b900 (16 bytes)554889e548897df8488b47185dc36690

@104

memorydumper2.SimpleClass.y.materializeForSet : Swift.Int 0x10000b930 (32 bytes)554889e54883c21831c089c14889d04889ca488975f848897df05dc30f1f4000

@120

memorydumper2.SimpleClass.z.setter : Swift.Int 0x10000b960 (32 bytes)554889e548897df8488975f048897e205dc366666666662e0f1f840000000000

Strings:fffff.

@136

memorydumper2.SimpleClass.z.materializeForSet : Swift.Int 0x10000b980 (32 bytes)554889e54883c22031c089c14889d04889ca488975f848897df05dc30f1f4000

@144

memorydumper2.SimpleClass.init () -> memorydumper2.SimpleClass 0x10000b9a0 (48 bytes)554889e548c747100100000048c747180200000048c74720030000004889f85dc36666666666662e0f1f840000000000

Strings:ffffff.

@152

@0 @8

@24

unknown 0x100d05484 (128 bytes)07000000607b3c00010000000000000000000000000000000000000000000000000000000000000000000000c8123d000100000000000000

000000005f547447...Strings:

_TtGCs22_NativeSetStorageOwnerSS_

@32

malloc 0x100d05120 (80 bytes)00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033dbb49bff7f0000

b0e2330001000000...

@16

unknown 0x100000001 (128 bytes)faedfe0700000103

000080020000001900000058120000850021000000000019000000480000005f5f504147455a45524f00000000000000

0000000000000000...Strings:

__PAGEZERO__TEXT

@120

@48 @56

@72

Instance of memorydumper2.SimpleClass 0x100d05170 (48 bytes)b8133d00010000000400000002000000010000000000000002000000000000000300000000000000

ffffffffffffffff

@0

Page 60: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Swift Types

unknown 0x100d050e5 (128 bytes)000000107c3c0001000000000000000000000000000000000000000000000000000000000000000000000000133d00010000000000000000

0000000000000000...

memorydumper2.SimpleClass.y.setter : Swift.Int 0x10000b910 (32 bytes)554889e548897df8488975f048897e185dc366666666662e0f1f840000000000

Strings:fffff.

memorydumper2.SimpleClass.z.getter : Swift.Int 0x10000b950 (16 bytes)554889e548897df8488b47205dc36690

OBJC_METACLASS_$_SwiftObject 0x1003d0c00 (40 bytes)000c3d0001000000d80b3d00010000006027d000010000000300000001000000c420d00001000000

@0

ObjC class SwiftObject 0x1003d0bd8 (40 bytes)000c3d00010000000000000000000000e00dff8cff7f0000

00000000000000002427d00001000000

@8

malloc 0x100d02760 (80 bytes)00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033dbb49bff7f0000

b0e2330001000000...

@16

unknown 0x100000003 (128 bytes)fe0700000103000080020000001900000058120000850021000000000019000000480000005f5f504147455a45524f000000000000000000

0000000000000000...Strings:

__PAGEZERO__TEXT

@24

unknown 0x100d020c4 (128 bytes)07000000d8d93c000100000000d53c00010000000000000000000000c0d93c000100000008c28e0001000000000000000000000000000000

0000000000000000...

@32

@0

_objc_empty_cache 0x7fff8cff0de0 (128 bytes)0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000...

@16

unknown 0x100d02724 (128 bytes)0000000010de3c000100000020da3c0001000000c8dd3c0001000000c0d93c000100000098c18e0001000000000000000000000000000000

0000000000000000...

@32

@72

CreateStringFromFileSystemRepresentationByAddingPercentEscapes.hexchars 0x7fff9bb4db33 (128 bytes)636c6173730069734b696e644f66436c6173733a0073657453656c6563743a00736574433a007365744d3a00736574466163746f723a0073

65744e756d4b6579...Strings:

classisKindOfClass:

setSelect:setC:setM:

setFactor:setNumKey:

setSeeds:setG:

setRankTable:setKeys2:

setKeyLen:setSubShare

@48

+[SwiftObject class] 0x10033e2b0 (16 bytes)4889f8c36666662e0f1f840000000000

Strings:fff.

@56

ObjC class memorydumper2.SimpleClass 0x1003d13b8 (184 bytes)80133d0001000000d80b3d0001000000e00dff8cff7f0000

0000000000000000e550d0000100000003000000000000002800000007000000

c800000010000000...

@32 @112 @128 @8

metaclass for memorydumper2.SimpleClass 0x1003d1380 (40 bytes)000c3d0001000000000c3d00010000002051d0000100000003000000010000008454d00001000000

@0

@16memorydumper2.SimpleClass.x.getter : Swift.Int 0x10000b8b0 (16 bytes)

554889e548897df8488b47105dc36690

@80

memorydumper2.SimpleClass.x.setter : Swift.Int 0x10000b8c0 (32 bytes)554889e548897df8488975f048897e105dc366666666662e0f1f840000000000

Strings:fffff.

@88

memorydumper2.SimpleClass.x.materializeForSet : Swift.Int 0x10000b8e0 (32 bytes)554889e54883c21031c089c14889d04889ca488975f848897df05dc30f1f4000

@96

memorydumper2.SimpleClass.y.getter : Swift.Int 0x10000b900 (16 bytes)554889e548897df8488b47185dc36690

@104

memorydumper2.SimpleClass.y.materializeForSet : Swift.Int 0x10000b930 (32 bytes)554889e54883c21831c089c14889d04889ca488975f848897df05dc30f1f4000

@120

memorydumper2.SimpleClass.z.setter : Swift.Int 0x10000b960 (32 bytes)554889e548897df8488975f048897e205dc366666666662e0f1f840000000000

Strings:fffff.

@136

memorydumper2.SimpleClass.z.materializeForSet : Swift.Int 0x10000b980 (32 bytes)554889e54883c22031c089c14889d04889ca488975f848897df05dc30f1f4000

@144

memorydumper2.SimpleClass.init () -> memorydumper2.SimpleClass 0x10000b9a0 (48 bytes)554889e548c747100100000048c747180200000048c74720030000004889f85dc36666666666662e0f1f840000000000

Strings:ffffff.

@152

@0 @8

@24

unknown 0x100d05484 (128 bytes)07000000607b3c00010000000000000000000000000000000000000000000000000000000000000000000000c8123d000100000000000000

000000005f547447...Strings:

_TtGCs22_NativeSetStorageOwnerSS_

@32

malloc 0x100d05120 (80 bytes)00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033dbb49bff7f0000

b0e2330001000000...

@16

unknown 0x100000001 (128 bytes)faedfe0700000103

000080020000001900000058120000850021000000000019000000480000005f5f504147455a45524f00000000000000

0000000000000000...Strings:

__PAGEZERO__TEXT

@120

@48 @56

@72

Instance of memorydumper2.SimpleClass 0x100d05170 (48 bytes)b8133d00010000000400000002000000010000000000000002000000000000000300000000000000

ffffffffffffffff

@0

Page 61: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Swift Types

CreateStringFromFileSystemRepresentationByAddingPercentEscapes.hexchars 0x7fff9659db33 (128 bytes)636c6173730069734b696e644f66436c6173733a0073657453656c6563743a00736574433a007365744d3a00736574466163746f723a0073

65744e756d4b6579...Strings:

classisKindOfClass:

setSelect:setC:setM:

setFactor:setNumKey:

setSeeds:setG:

setRankTable:setKeys2:

setKeyLen:setSubShare

Instance of memorydumper2.ClassWithPadding 0x101700c00 (48 bytes)00063d000100000004000000020000000102030004000500060000000700000008000000000000004f00171000000300

ObjC class memorydumper2.ClassWithPadding 0x1003d0600 (344 bytes)c8053d000100000030fd3c0001000000e02d018aff7f0000

0000000000000000950c70010100000003000000000000002800000007000000

6801000010000000...

@0

memorydumper2.ClassWithPadding.a.setter : Swift.UInt8 0x10000c050 (32 bytes)554889e54088f88845f8488975f08846105dc3666666662e0f1f840000000000

Strings:ffff.

@88

memorydumper2.ClassWithPadding.d.getter : Swift.UInt16 0x10000c130 (16 bytes)554889e548897df8668b47145dc36690

@152

memorydumper2.ClassWithPadding.b.setter : Swift.UInt8 0x10000c0a0 (32 bytes)554889e54088f88845f8488975f08846115dc3666666662e0f1f840000000000

Strings:ffff.

@112

memorydumper2.ClassWithPadding.d.materializeForSet : Swift.UInt16 0x10000c160 (32 bytes)554889e54883c21431c089c14889d04889ca488975f848897df05dc30f1f4000

@168

memorydumper2.ClassWithPadding.f.getter : Swift.UInt32 0x10000c1d0 (16 bytes)554889e548897df88b47185dc30f1f00

@200

memorydumper2.ClassWithPadding.f.setter : Swift.UInt32 0x10000c1e0 (16 bytes)554889e5897df8488975f0897e185dc3

@208

ObjC class SwiftObject 0x1003cfd30 (40 bytes)58fd3c00010000000000000000000000e02d018aff7f0000

00000000000000009427600101000000

@8

memorydumper2.ClassWithPadding.g.setter : Swift.UInt8 0x10000c220 (32 bytes)554889e54088f88845f8488975f088461c5dc3666666662e0f1f840000000000

Strings:ffff.

@232

memorydumper2.ClassWithPadding.h.setter : Swift.UInt64 0x10000c270 (32 bytes)554889e548897df8488975f048897e205dc366666666662e0f1f840000000000

Strings:fffff.

@256

memorydumper2.ClassWithPadding.e.getter : Swift.UInt8 0x10000c180 (16 bytes)554889e548897df88a47165dc30f1f00

@176

memorydumper2.ClassWithPadding.c.getter : Swift.UInt8 0x10000c0e0 (16 bytes)554889e548897df88a47125dc30f1f00

@128

_objc_empty_cache 0x7fff8a012de0 (128 bytes)0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000...

@16

unknown 0x101700c95 (128 bytes)000000f86e3c0001000000000000000000000000000000000000000000000000000000000000000000000010053d00010000000000000000

0000000000000000...

@32

memorydumper2.ClassWithPadding.c.setter : Swift.UInt8 0x10000c0f0 (32 bytes)554889e54088f88845f8488975f08846125dc3666666662e0f1f840000000000

Strings:ffff.

@136

metaclass for memorydumper2.ClassWithPadding 0x1003d05c8 (40 bytes)58fd3c000100000058fd3c0001000000d00c7001010000000300000001000000540c700101000000

@0

memorydumper2.ClassWithPadding.a.getter : Swift.UInt8 0x10000c040 (16 bytes)554889e548897df88a47105dc30f1f00

@80

memorydumper2.ClassWithPadding.a.materializeForSet : Swift.UInt8 0x10000c070 (32 bytes)554889e54883c21031c089c14889d04889ca488975f848897df05dc30f1f4000

@96

memorydumper2.ClassWithPadding.b.getter : Swift.UInt8 0x10000c090 (16 bytes)554889e548897df88a47115dc30f1f00

@104

memorydumper2.ClassWithPadding.b.materializeForSet : Swift.UInt8 0x10000c0c0 (32 bytes)554889e54883c21131c089c14889d04889ca488975f848897df05dc30f1f4000

@120

memorydumper2.ClassWithPadding.c.materializeForSet : Swift.UInt8 0x10000c110 (32 bytes)554889e54883c21231c089c14889d04889ca488975f848897df05dc30f1f4000

@144

memorydumper2.ClassWithPadding.d.setter : Swift.UInt16 0x10000c140 (32 bytes)554889e56689f8668945f8488975f0668946145dc366662e0f1f840000000000

@160

memorydumper2.ClassWithPadding.e.setter : Swift.UInt8 0x10000c190 (32 bytes)554889e54088f88845f8488975f08846165dc3666666662e0f1f840000000000

Strings:ffff.

@184

memorydumper2.ClassWithPadding.e.materializeForSet : Swift.UInt8 0x10000c1b0 (32 bytes)554889e54883c21631c089c14889d04889ca488975f848897df05dc30f1f4000

@192

memorydumper2.ClassWithPadding.f.materializeForSet : Swift.UInt32 0x10000c1f0 (32 bytes)554889e54883c21831c089c14889d04889ca488975f848897df05dc30f1f4000

@216

memorydumper2.ClassWithPadding.g.getter : Swift.UInt8 0x10000c210 (16 bytes)554889e548897df88a471c5dc30f1f00

@224

memorydumper2.ClassWithPadding.g.materializeForSet : Swift.UInt8 0x10000c240 (32 bytes)554889e54883c21c31c089c14889d04889ca488975f848897df05dc30f1f4000

@240

memorydumper2.ClassWithPadding.h.getter : Swift.UInt64 0x10000c260 (16 bytes)554889e548897df8488b47205dc36690

@248

memorydumper2.ClassWithPadding.h.materializeForSet : Swift.UInt64 0x10000c290 (32 bytes)554889e54883c22031c089c14889d04889ca488975f848897df05dc30f1f4000

@264

memorydumper2.ClassWithPadding.init () -> memorydumper2.ClassWithPadding 0x10000c2b0 (64 bytes)554889e5c6471001c6471102c647120366c747140400c6471605c7471806000000c6471c0748c74720080000004889f85dc366666666662e0f1f840000000000

Strings:fffff.

@272

unknown 0x101700c54 (128 bytes)07000000a86d3c00010000000000000000000000000000000000000000000000000000000000000000000000d8043d000100000000000000

0000000000000880...

unknown 0x101602754 (128 bytes)0700000028cb3c000100000050c63c0001000000000000000000000010cb3c000100000008d21a0101000000000000000000000000000000

0000000000000880...

OBJC_METACLASS_$_SwiftObject 0x1003cfd58 (40 bytes)58fd3c000100000030fd3c0001000000d02760010100000003000000010000005427600101000000

@32

@0

@8

malloc 0x1016027d0 (80 bytes)00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033db5996ff7f0000

c0cd330001000000...

@16

unknown 0x100000003 (128 bytes)fe0700000103000080020000001900000058120000850021000000000019000000480000005f5f504147455a45524f000000000000000000

0000000000000000...Strings:

__PAGEZERO__TEXT

@24@0

@16

unknown 0x101602794 (128 bytes)0000000060cf3c000100000070cb3c000100000018cf3c000100000010cb3c000100000098d11a0101000000000000000000000000000000

0000000000000000...

@32 @48

@72

+[SwiftObject class] 0x10033cdc0 (16 bytes)4889f8c36666662e0f1f840000000000

Strings:fff.

@56

malloc 0x101700cd0 (80 bytes)00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033db5996ff7f0000

c0cd330001000000...

@48

@72

@56

@32@0 @8

@24 @16

unknown 0x100000001 (128 bytes)faedfe0700000103

000080020000001900000058120000850021000000000019000000480000005f5f504147455a45524f00000000000000

0000000000000000...Strings:

__PAGEZERO__TEXT

@120

class ClassWithPadding { var a: UInt8 = 1 var b: UInt8 = 2 var c: UInt8 = 3 var d: UInt16 = 4 var e: UInt8 = 5 var f: UInt32 = 6 var g: UInt8 = 7 var h: UInt64 = 8}

Page 62: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Swift Types

class (isa)

retain counts

stored properties

stored properties

Object

Page 63: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Swift Types

class (isa)

retain counts

stored properties

stored properties

Object

strong count weak count

Page 64: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Swift Types

class (isa)

retain counts

stored properties

stored properties

Object

class (isa)

Class

Page 65: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Swift Types

11001isa10011

retain counts

stored properties

stored properties

Object

class (isa)

Class

Page 66: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

CreateStringFromFileSystemRepresentationByAddingPercentEscapes.hexchars 0x7fff9659db33 (128 bytes)636c6173730069734b696e644f66436c6173733a0073657453656c6563743a00736574433a007365744d3a00736574466163746f723a0073

65744e756d4b6579...Strings:

classisKindOfClass:

setSelect:setC:setM:

setFactor:setNumKey:

setSeeds:setG:

setRankTable:setKeys2:

setKeyLen:setSubShare

Instance of memorydumper2.ClassWithPadding 0x101700c00 (48 bytes)00063d000100000004000000020000000102030004000500060000000700000008000000000000004f00171000000300

ObjC class memorydumper2.ClassWithPadding 0x1003d0600 (344 bytes)c8053d000100000030fd3c0001000000e02d018aff7f0000

0000000000000000950c70010100000003000000000000002800000007000000

6801000010000000...

@0

memorydumper2.ClassWithPadding.a.setter : Swift.UInt8 0x10000c050 (32 bytes)554889e54088f88845f8488975f08846105dc3666666662e0f1f840000000000

Strings:ffff.

@88

memorydumper2.ClassWithPadding.d.getter : Swift.UInt16 0x10000c130 (16 bytes)554889e548897df8668b47145dc36690

@152

memorydumper2.ClassWithPadding.b.setter : Swift.UInt8 0x10000c0a0 (32 bytes)554889e54088f88845f8488975f08846115dc3666666662e0f1f840000000000

Strings:ffff.

@112

memorydumper2.ClassWithPadding.d.materializeForSet : Swift.UInt16 0x10000c160 (32 bytes)554889e54883c21431c089c14889d04889ca488975f848897df05dc30f1f4000

@168

memorydumper2.ClassWithPadding.f.getter : Swift.UInt32 0x10000c1d0 (16 bytes)554889e548897df88b47185dc30f1f00

@200

memorydumper2.ClassWithPadding.f.setter : Swift.UInt32 0x10000c1e0 (16 bytes)554889e5897df8488975f0897e185dc3

@208

ObjC class SwiftObject 0x1003cfd30 (40 bytes)58fd3c00010000000000000000000000e02d018aff7f0000

00000000000000009427600101000000

@8

memorydumper2.ClassWithPadding.g.setter : Swift.UInt8 0x10000c220 (32 bytes)554889e54088f88845f8488975f088461c5dc3666666662e0f1f840000000000

Strings:ffff.

@232

memorydumper2.ClassWithPadding.h.setter : Swift.UInt64 0x10000c270 (32 bytes)554889e548897df8488975f048897e205dc366666666662e0f1f840000000000

Strings:fffff.

@256

memorydumper2.ClassWithPadding.e.getter : Swift.UInt8 0x10000c180 (16 bytes)554889e548897df88a47165dc30f1f00

@176

memorydumper2.ClassWithPadding.c.getter : Swift.UInt8 0x10000c0e0 (16 bytes)554889e548897df88a47125dc30f1f00

@128

_objc_empty_cache 0x7fff8a012de0 (128 bytes)0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000...

@16

unknown 0x101700c95 (128 bytes)000000f86e3c0001000000000000000000000000000000000000000000000000000000000000000000000010053d00010000000000000000

0000000000000000...

@32

memorydumper2.ClassWithPadding.c.setter : Swift.UInt8 0x10000c0f0 (32 bytes)554889e54088f88845f8488975f08846125dc3666666662e0f1f840000000000

Strings:ffff.

@136

metaclass for memorydumper2.ClassWithPadding 0x1003d05c8 (40 bytes)58fd3c000100000058fd3c0001000000d00c7001010000000300000001000000540c700101000000

@0

memorydumper2.ClassWithPadding.a.getter : Swift.UInt8 0x10000c040 (16 bytes)554889e548897df88a47105dc30f1f00

@80

memorydumper2.ClassWithPadding.a.materializeForSet : Swift.UInt8 0x10000c070 (32 bytes)554889e54883c21031c089c14889d04889ca488975f848897df05dc30f1f4000

@96

memorydumper2.ClassWithPadding.b.getter : Swift.UInt8 0x10000c090 (16 bytes)554889e548897df88a47115dc30f1f00

@104

memorydumper2.ClassWithPadding.b.materializeForSet : Swift.UInt8 0x10000c0c0 (32 bytes)554889e54883c21131c089c14889d04889ca488975f848897df05dc30f1f4000

@120

memorydumper2.ClassWithPadding.c.materializeForSet : Swift.UInt8 0x10000c110 (32 bytes)554889e54883c21231c089c14889d04889ca488975f848897df05dc30f1f4000

@144

memorydumper2.ClassWithPadding.d.setter : Swift.UInt16 0x10000c140 (32 bytes)554889e56689f8668945f8488975f0668946145dc366662e0f1f840000000000

@160

memorydumper2.ClassWithPadding.e.setter : Swift.UInt8 0x10000c190 (32 bytes)554889e54088f88845f8488975f08846165dc3666666662e0f1f840000000000

Strings:ffff.

@184

memorydumper2.ClassWithPadding.e.materializeForSet : Swift.UInt8 0x10000c1b0 (32 bytes)554889e54883c21631c089c14889d04889ca488975f848897df05dc30f1f4000

@192

memorydumper2.ClassWithPadding.f.materializeForSet : Swift.UInt32 0x10000c1f0 (32 bytes)554889e54883c21831c089c14889d04889ca488975f848897df05dc30f1f4000

@216

memorydumper2.ClassWithPadding.g.getter : Swift.UInt8 0x10000c210 (16 bytes)554889e548897df88a471c5dc30f1f00

@224

memorydumper2.ClassWithPadding.g.materializeForSet : Swift.UInt8 0x10000c240 (32 bytes)554889e54883c21c31c089c14889d04889ca488975f848897df05dc30f1f4000

@240

memorydumper2.ClassWithPadding.h.getter : Swift.UInt64 0x10000c260 (16 bytes)554889e548897df8488b47205dc36690

@248

memorydumper2.ClassWithPadding.h.materializeForSet : Swift.UInt64 0x10000c290 (32 bytes)554889e54883c22031c089c14889d04889ca488975f848897df05dc30f1f4000

@264

memorydumper2.ClassWithPadding.init () -> memorydumper2.ClassWithPadding 0x10000c2b0 (64 bytes)554889e5c6471001c6471102c647120366c747140400c6471605c7471806000000c6471c0748c74720080000004889f85dc366666666662e0f1f840000000000

Strings:fffff.

@272

unknown 0x101700c54 (128 bytes)07000000a86d3c00010000000000000000000000000000000000000000000000000000000000000000000000d8043d000100000000000000

0000000000000880...

unknown 0x101602754 (128 bytes)0700000028cb3c000100000050c63c0001000000000000000000000010cb3c000100000008d21a0101000000000000000000000000000000

0000000000000880...

OBJC_METACLASS_$_SwiftObject 0x1003cfd58 (40 bytes)58fd3c000100000030fd3c0001000000d02760010100000003000000010000005427600101000000

@32

@0

@8

malloc 0x1016027d0 (80 bytes)00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033db5996ff7f0000

c0cd330001000000...

@16

unknown 0x100000003 (128 bytes)fe0700000103000080020000001900000058120000850021000000000019000000480000005f5f504147455a45524f000000000000000000

0000000000000000...Strings:

__PAGEZERO__TEXT

@24@0

@16

unknown 0x101602794 (128 bytes)0000000060cf3c000100000070cb3c000100000018cf3c000100000010cb3c000100000098d11a0101000000000000000000000000000000

0000000000000000...

@32 @48

@72

+[SwiftObject class] 0x10033cdc0 (16 bytes)4889f8c36666662e0f1f840000000000

Strings:fff.

@56

malloc 0x101700cd0 (80 bytes)00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033db5996ff7f0000

c0cd330001000000...

@48

@72

@56

@32@0 @8

@24 @16

unknown 0x100000001 (128 bytes)faedfe0700000103

000080020000001900000058120000850021000000000019000000480000005f5f504147455a45524f00000000000000

0000000000000000...Strings:

__PAGEZERO__TEXT

@120

Objective-C Classeshttp://opensource.apple.com/source/objc4/

runtime.h

Page 67: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Objective-C Classes Class isa Class super_class const char *name long version long info long instance_size struct objc_ivar_list *ivars struct objc_method_list **methodLists struct objc_cache *cache struct objc_protocol_list *protocols

Page 68: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Swift Classes

uint32_t flags; uint32_t instanceAddressOffset; uint32_t instanceSize; uint16_t instanceAlignMask; uint16_t reserved;

uint32_t classSize; uint32_t classAddressOffset; void *description;

Page 69: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Swift Classes

class (isa)

...

...

Method 1

Class

Method 2

Method 3

Method 4

Page 70: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Method Calls

class (isa)

...

...

Method 1

Method 2

Method 3

Method 4

obj.method()

class = obj->isamethodf = class[method_offset]methodf(obj)

Page 71: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Subclassesclass DeepClassSuper1 { var a = 1}class DeepClassSuper2: DeepClassSuper1 { var b = 2}class DeepClassSuper3: DeepClassSuper2 { var c = 3}class DeepClass: DeepClassSuper3 { var d = 4}

Page 72: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Subclasses

memorydumper2.DeepClassSuper1.init () -> memorydumper2.DeepClassSuper1 0x10000c400 (32 bytes)554889e548c74710010000004889f85dc36666666666662e0f1f840000000000

Strings:ffffff.

CreateStringFromFileSystemRepresentationByAddingPercentEscapes.hexchars 0x7fff9659db33 (128 bytes)636c6173730069734b696e644f66436c6173733a0073657453656c6563743a00736574433a007365744d3a00736574466163746f723a0073

65744e756d4b6579...Strings:

classisKindOfClass:

setSelect:setC:setM:

setFactor:setNumKey:

setSeeds:setG:

setRankTable:setKeys2:

setKeyLen:setSubShare

ObjC class memorydumper2.DeepClass 0x1003d0a00 (216 bytes)c8093d000100000010093d0001000000e02d018aff7f0000

0000000000000000651020010100000003000000000000003000000007000000

e800000010000000...

metaclass for memorydumper2.DeepClass 0x1003d09c8 (40 bytes)58fd3c0001000000d8083d000100000060112001010000000300000001000000b40d200101000000

@0

ObjC class memorydumper2.DeepClassSuper3 0x1003d0910 (184 bytes)d8083d000100000040083d0001000000e02d018aff7f0000

0000000000000000a51020010100000003000000000000002800000007000000

c800000010000000...

@8

_objc_empty_cache 0x7fff8a012de0 (128 bytes)0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000...

@16

unknown 0x101201065 (128 bytes)000000d8713c0001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000088000...

@32

memorydumper2.DeepClassSuper1.a.getter : Swift.Int 0x10000c3b0 (16 bytes)554889e548897df8488b47105dc36690

@80

memorydumper2.DeepClassSuper1.a.setter : Swift.Int 0x10000c3c0 (32 bytes)554889e548897df8488975f048897e105dc366666666662e0f1f840000000000

Strings:fffff.

@88

memorydumper2.DeepClassSuper1.a.materializeForSet : Swift.Int 0x10000c3e0 (32 bytes)554889e54883c21031c089c14889d04889ca488975f848897df05dc30f1f4000

@96

memorydumper2.DeepClass.init () -> memorydumper2.DeepClass 0x10000c720 (48 bytes)554889e54883ec1048897df848c7472804000000e8d7feffff488945f84883c4105dc3666666662e0f1f840000000000

Strings:ffff.

@104

memorydumper2.DeepClassSuper2.b.getter : Swift.Int 0x10000c4b0 (16 bytes)554889e548897df8488b47185dc36690

@120

memorydumper2.DeepClassSuper2.b.setter : Swift.Int 0x10000c4c0 (32 bytes)554889e548897df8488975f048897e185dc366666666662e0f1f840000000000

Strings:fffff.

@128

memorydumper2.DeepClassSuper2.b.materializeForSet : Swift.Int 0x10000c4e0 (32 bytes)554889e54883c21831c089c14889d04889ca488975f848897df05dc30f1f4000

@136

memorydumper2.DeepClassSuper3.c.getter : Swift.Int 0x10000c5c0 (16 bytes)554889e548897df8488b47205dc36690

@152

memorydumper2.DeepClassSuper3.c.setter : Swift.Int 0x10000c5d0 (32 bytes)554889e548897df8488975f048897e205dc366666666662e0f1f840000000000

Strings:fffff.

@160

memorydumper2.DeepClassSuper3.c.materializeForSet : Swift.Int 0x10000c5f0 (32 bytes)554889e54883c22031c089c14889d04889ca488975f848897df05dc30f1f4000

@168memorydumper2.DeepClass.d.getter : Swift.Int 0x10000c6d0 (16 bytes)

554889e548897df8488b47285dc36690

@184

memorydumper2.DeepClass.d.setter : Swift.Int 0x10000c6e0 (32 bytes)554889e548897df8488975f048897e285dc366666666662e0f1f840000000000

Strings:fffff.

@192

memorydumper2.DeepClass.d.materializeForSet : Swift.Int 0x10000c700 (32 bytes)554889e54883c22831c089c14889d04889ca488975f848897df05dc30f1f4000

@200

metaclass for memorydumper2.DeepClassSuper3 0x1003d08d8 (40 bytes)58fd3c000100000008083d0001000000e02d018aff7f0000

0000000000000000f40d200101000000

@8

OBJC_METACLASS_$_SwiftObject 0x1003cfd58 (40 bytes)58fd3c000100000030fd3c0001000000e00670010100000003000000010000006406700101000000

@0

unknown 0x101200db4 (128 bytes)0700000068713c00010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

00000000000008a0...

@32

unknown 0x100000003 (128 bytes)fe0700000103000080020000001900000058120000850021000000000019000000480000005f5f504147455a45524f000000000000000000

0000000000000000...Strings:

__PAGEZERO__TEXT

@24

malloc 0x101201160 (80 bytes)00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033db5996ff7f0000

c0cd330001000000...

@16

@16

@80 @88 @96

@120 @128 @136

@152 @160@168@0

ObjC class memorydumper2.DeepClassSuper2 0x1003d0840 (152 bytes)08083d000100000090073d0001000000e02d018aff7f0000

0000000000000000e51020010100000003000000000000002000000007000000

a800000010000000...

@8

unknown 0x1012010a5 (128 bytes)00000020713c0001000000000000000000000000000000000000000000000000000000000a3d000100000000000000000000000000000000

0000000000088000...

@32

memorydumper2.DeepClassSuper3.init () -> memorydumper2.DeepClassSuper3 0x10000c610 (48 bytes)554889e54883ec1048897df848c7472003000000e8d7feffff488945f84883c4105dc3666666662e0f1f840000000000

Strings:ffff.

@104

malloc 0x1017006e0 (80 bytes)00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033db5996ff7f0000

c0cd330001000000...

@48

@72

+[SwiftObject class] 0x10033cdc0 (16 bytes)4889f8c36666662e0f1f840000000000

Strings:fff.

@56

@16@0

metaclass for memorydumper2.DeepClassSuper2 0x1003d0808 (40 bytes)58fd3c000100000058073d0001000000e02d018aff7f0000

0000000000000000340e200101000000

@8

unknown 0x101200df4 (128 bytes)07000000b0703c0001000000000000000000000000000000000000000000000000000000c8093d0001000000000000000000000000000000

00000000000008a0...

@32

@16

@80 @88 @96

@120 @128 @136@0

ObjC class memorydumper2.DeepClassSuper1 0x1003d0790 (120 bytes)58073d000100000030fd3c0001000000e02d018aff7f0000

0000000000000000251120010100000003000000000000001800000007000000

8800000010000000...

@8

unknown 0x1012010e5 (128 bytes)00000068703c000100000000000000000000000000000000000000000000000000000010093d000100000000000000000000000000000000

0000000000088000...

@32

memorydumper2.DeepClassSuper2.init () -> memorydumper2.DeepClassSuper2 0x10000c500 (48 bytes)554889e54883ec1048897df848c7471802000000e8e7feffff488945f84883c4105dc3666666662e0f1f840000000000

Strings:ffff.

@104

Instance of memorydumper2.DeepClass 0x101200c90 (48 bytes)000a3d000100000004000000020000000100000000000000020000000000000003000000000000000400000000000000

@0

@16

@0

ObjC class SwiftObject 0x1003cfd30 (40 bytes)58fd3c00010000000000000000000000e02d018aff7f0000

0000000000000000a406700101000000

@8

@24

unknown 0x101700664 (128 bytes)0700000028cb3c000100000050c63c0001000000000000000000000010cb3c000100000008d21a0101000000000000000000000000000000

0000000000000880...

@32

@16@0

metaclass for memorydumper2.DeepClassSuper1 0x1003d0758 (40 bytes)58fd3c000100000058fd3c0001000000e02d018aff7f0000

0000000000000000740e200101000000

@8

unknown 0x101200e34 (128 bytes)07000000f86f3c0001000000000000000000000000000000000000000000000000000000d8083d0001000000000000000000000000000000

00000000000008a0...

@32

@16@0

unknown 0x1017006a4 (128 bytes)0000000060cf3c000100000070cb3c000100000018cf3c000100000010cb3c000100000098d11a0101000000000000000000000000000000

0000000000000000...

@32

unknown 0x100000001 (128 bytes)faedfe0700000103

000080020000001900000058120000850021000000000019000000480000005f5f504147455a45524f00000000000000

0000000000000000...Strings:

__PAGEZERO__TEXT

@16@0@8

unknown 0x101200e74 (128 bytes)07000000406f3c000100000000000000000000000000000000000000000000000000000008083d0001000000c8053d000100000000000000

0000000000000000...

@32

unknown 0x101201125 (128 bytes)000000b06f3c000100000000000000000000000000000000000000000000000000000040083d000100000000063d00010000000000000000

0000000000000000...

@104

@16

@80 @88 @96@8@0 @32

@120

@48 @56

@72

Page 73: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Arrays[1, 2, 3, 4, 5]

Page 74: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Arrays[1, 2, 3, 4, 5]

Swift._ContiguousArrayStorage1._withVerbatimBridgedUnsafeBuffer <A> ((Swift.UnsafeBufferPointer<Swift.AnyObject>) throws -> A) throws -> A? 0x1000f7a30 (592 bytes)554889e54157415641554154534883ec784c894d804c898578ffffff4989cd48

8955904889b570ffffff4889fb4c896d

d0488d3dc84a2f00488d75d0e88f790b...

Strings:AWAVAUATSH

T$XIx[A\A]A^A_]

ffffff.

Swift._ContiguousArrayStorageBase.withUnsafeBufferOfObjects <A> ((Swift.UnsafeBufferPointer<Swift.AnyObject>) throws -> A) throws -> A 0x1000f7570 (464 bytes)554889e54157415641554154534883ec584d89cc4d89c748894d984989d64989f548897da048894dd0488d3d904f2f00488d75d0e8577e0b

00488945a8488b48...Strings:

AWAVAUATSHX[A\A]A^A_]

ffff.

Instance of Swift._ContiguousArrayStorage<Swift.Int> 0x101501650 (80 bytes)40c31a0101000000080000000200000005000000000000000a00000000000000010000000000000002000000000000000300000000000000

0400000000000000...

ObjC class Swift._ContiguousArrayStorage<Swift.Int> 0x1011ac340 (128 bytes)e0c31a010100000098f63c0001000000e02d018aff7f0000

0000000000000000d51550010100000003000000000000001000000007000000

a800000010000000...

@0

@96 @88

ObjC class Swift._ContiguousArrayStorage1 0x1003cf698 (144 bytes)386d3e000100000008fc3c0001000000e02d018aff7f0000

0000000000000000a5c920010100000003000000000000001000000007000000

a000000010000000...

@8

swift_deletedMethodError 0x100329c40 (32 bytes)554889e5488d35826a030031ff31c0e84cffffff90909090

9090909090909090

@120

unknown 0x1011ac3e0 (128 bytes)18d1eb79ff7f0000

386d3e0001000000e02d018aff7f0000

0000000000000000141650010100000080000000100000001000000000000000

0000000000000000...

@0

Swift._ContiguousArrayStorage.init () -> Swift._ContiguousArrayStorage<A> 0x1000f88a0 (16 bytes)554889e54889f85dc30f1f8000000000

@80

Swift._ContiguousArrayStorage._getNonVerbatimBridgedHeapBuffer () -> Swift._HeapBuffer<Swift.Int, Swift.AnyObject> 0x1000f8250 (496 bytes)554889e54157415641554154534883ec5848897db0488b07488b5f1048895da84c8ba090000000488b3de2af2f004885ff7555488b05767e

2d004885c0752048...Strings:

AWAVAUATSHX[A\A]A^A_]

@112

unknown 0x1015015d5 (128 bytes)00000008c41a010100000030993c0001000000000000000000000000000000000000000000000000000000b8c11a01010000000000000000

0000000000088007...

@32

_objc_empty_cache 0x7fff8a012de0 (128 bytes)0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000...

@16

Swift._ContiguousArrayStorage._getNonVerbatimBridgedCount () -> Swift.Int 0x1000f8240 (16 bytes)554889e5488b47105dc3660f1f440000

@104

unknown 0x7fff5fbff280 (8 bytes)5016500101000000

@0

Page 75: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Protocols

protocol P { func f() func g() func h()}

struct ProtocolHolder { var a: P var b: P var c: P}

Page 76: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Protocols

struct StructSmallP: P { func f() {} func g() {} func h() {} var a = 0x6c6c616d73 // "small"}

Page 77: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Protocolsstruct StructBigP: P { func f() {} func g() {} func h() {} var a = 0x656772616c // "large" var b = 0x1010101010101010 var c = 0x2020202020202020 var d = 0x3030303030303030}

Page 78: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Protocolsstruct ClassP: P { func f() {} func g() {} func h() {} var a = 0x7373616c63 // "class" var b = 0x4040404040404040 var c = 0x5050505050505050 var d = 0x6060606060606060}

Page 79: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Protocols

let holder = ProtocolHolder( a: StructSmallP(), b: StructBigP(), c: ClassP())

Page 80: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Protocols

protocol witness for Swift._ArrayBufferProtocol.requestUniqueMutableBackingBuffer (minimumCapacity : Swift.Int) -> Swift._ContiguousArrayBuffer<A.Element>? in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x100073500 (32 bytes)554889e54889f04889d64889c25de90d000000666666662e0f1f840000000000

Strings:ffff.

unknown 0x1011d7028 (128 bytes)10801d010100000028a01d010100000020672f0001000000d0932b000100000010942b0001000000601218000100000050942b0001000000

70942b0001000000...

Swift._ContiguousArrayStorage.__deallocating_deinit 0x1000f7e30 (96 bytes)554889e553504889fb488b03488b7310488b9090000000488b42f8488bb8900000000fb7cf4883c1204881cf0000ffff4881f7ffff000048

21cf4801dfff5068...

protocol witness for Swift._ArrayBufferProtocol.replace <A where A1: Swift.Collection, A.Element == A1.Iterator.Element> (subRange : Swift.Range<Swift.Int>, with : Swift.Int, elementsOf : A1) -> () in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x100073bd0 (112 bytes)554889e54157415641554154534883ec284d89cd4c8945d04989cf4989d44889f34989fe488b7518488d3d9936360031d2e84a552400488b

4d1048894c24104c...Strings:

AWAVAUATSH([A\A]A^A_]

Swift._ContiguousArrayStorage.init () -> Swift._ContiguousArrayStorage<A> 0x1000f88a0 (16 bytes)554889e54889f85dc30f1f8000000000

protocol witness table for memorydumper2.ClassP : memorydumper2.P in memorydumper2 0x10039ca90 (24 bytes)90cf000001000000e0cf00000100000030d0000001000000

protocol witness for memorydumper2.P.f () -> () in conformance memorydumper2.ClassP : memorydumper2.P in memorydumper2 0x10000cf90 (80 bytes)554889e54883ec30488d45e0488b0f4c8b47084c8b4f10488b7f1848894de04c8945e84c894df048897df84889c7488975d8488955d0e805fdffff4883c4305d...

Strings:ffffff.

@0

protocol witness for memorydumper2.P.g () -> () in conformance memorydumper2.ClassP : memorydumper2.P in memorydumper2 0x10000cfe0 (80 bytes)554889e54883ec30488d45e0488b0f4c8b47084c8b4f10488b7f1848894de04c8945e84c894df048897df84889c7488975d8488955d0e8e5fcffff4883c4305d...

Strings:ffffff.

@8

protocol witness for memorydumper2.P.h () -> () in conformance memorydumper2.ClassP : memorydumper2.P in memorydumper2 0x10000d030 (80 bytes)554889e54883ec30488d45e0488b0f4c8b47084c8b4f10488b7f1848894de04c8945e84c894df048897df84889c7488975d8488955d0e8c5fcffff4883c4305d...

Strings:ffffff.

@16

type metadata accessor for Swift.CountableRange<Swift.Int> 0x100181260 (64 bytes)488b05c11c25004885c0752d554889e5488d3db1b12300488d357acf2200488d15b3d02200488d0de4d02200e88fc21000488905901c25005dc3660f1f440000

Strings:u-UH

unknown 0x1011d0008 (128 bytes)000000000000000020101d010100000028701d0101000000601218000100000030802a0001000000b0702f0001000000c02c070001000000

f02c070001000000...

@96 @16 @120 @24

unknown 0x1011d1020 (128 bytes)18201d010100000038501d010100000010672f000100000030932b000100000060402f0001000000a0402f00010000002040300001000000a0e72f0001000000...

@8

lazy protocol witness table accessor for type Swift.CountableRange<Swift.Int> and conformance <A where A: Swift.Comparable, A: Swift._Strideable, A.Stride: Swift.SignedInteger> Swift.CountableRange<A> : Swift.RandomAccessCollection in Swift 0x1002a8030 (32 bytes)554889e5488d3d5dbb1200488d35866213005de9781701000f1f840000000000

@32

associated type metadata accessor for Element in <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x1002f70b0 (16 bytes)554889e55de93681fcff660f1f440000

@40

protocol witness for Swift._ArrayBufferProtocol.init () -> A in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x100072cc0 (48 bytes)554889e553504889fbe842f2fcff488d

05031038004889034889d84883c4085b5dc366666666662e0f1f840000000000

Strings:fffff.

@48

protocol witness for Swift._ArrayBufferProtocol.init (Swift._ContiguousArrayBuffer<A.Element>, shiftedToStartIndex : Swift.Int) -> A in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x100072cf0 (32 bytes)554889e553504889fb4889f7e80f0000

004889034889d84883c4085b5dc36690

@56

protocol witness for Swift._ArrayBufferProtocol._copyContents (subRange : Swift.Range<Swift.Int>, initializing : Swift.UnsafeMutablePointer<A.Element>) -> Swift.UnsafeMutablePointer<A.Element> in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x100072d20 (96 bytes)554889e5415741564155415453504989d64989f74989fc488b194d8b68204889dfe82aa92c004c89e74c89fe4c89f24889d94d89e8e89600

00004989c64889df...Strings:

AWAVAUATSPI[A\A]A^A_]

@64

protocol witness for Swift._ArrayBufferProtocol.subscript.getter : (Swift.Int) -> A.Element in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x1000731a0 (80 bytes)554889e5415741564154534989f64989ff488b1a4c8b61204889dfe8b0a42c004c89ff4c89f64889da4c89e1e87ff7fcff4889dfe837a52c

004c89f85b415c41...Strings:

AWAVATSI[A\A^A_]

@72

protocol witness for Swift._ArrayBufferProtocol.subscript.setter : (Swift.Int) -> A.Element in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x100073450 (80 bytes)554889e5415741564154534989f64989ff488b1a4c8b61204889dfe800a22c004c89ff4c89f64889da4c89e1e8bf31fdff4889df5b415c41

5e415f5de97fa22c...Strings:

AWAVATSI[A\A^A_]

ffffff.

@80

protocol witness for Swift._ArrayBufferProtocol.subscript.materializeForSet : (Swift.Int) -> A.Element in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x1000734a0 (96 bytes)554889e5415741564155415453504989d64989f74989fc488b194d8b68204889dfe8aaa12c004c89e74c89fe4c89f24889d94d89e8e8b63bfdff4989c64989d7...

Strings:AWAVAUATSPI

[A\A]A^A_]

@88

protocol witness for Swift._ArrayBufferProtocol.isMutableAndUniquelyReferenced () -> Swift.Bool in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x100073620 (32 bytes)554889e54889f84889f74889c65de9fd020000666666662e0f1f840000000000

Strings:ffff.

@104

protocol witness for Swift._ArrayBufferProtocol.requestNativeBuffer () -> Swift._ContiguousArrayBuffer<A.Element>? in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x100073b20 (64 bytes)554889e5415653488b1f4c8b76204889dfe83a9b2c004889df4c89f6e81f0000004989c64889dfe8c49b2c004c89f05b415e5dc36666662e0f1f840000000000

Strings:AVSH[A^]fff.

@112

value witness table for Builtin.UnknownObject 0x1003c5908 (184 bytes)90c3320001000000a0c3320001000000c0c3320001000000d0c3320001000000e0c3320001000000f0c332000100000010c4320001000000

30c4320001000000...

type metadata for memorydumper2.StructBigP 0x10039d318 (56 bytes)0100000000000000

08d2faffffffffff00000000000000000000000000000000080000000000000010000000000000001800000000000000

_objc_empty_cache 0x7fff8a012de0 (128 bytes)0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000...

protocol witness for memorydumper2.P.f () -> () in conformance memorydumper2.StructSmallP : memorydumper2.P in memorydumper2 0x10000c8c0 (32 bytes)554889e54883ec10488b3f488975f8488955f0e838ffffff

4883c4105dc36690

type metadata for memorydumper2.MemoryRegion.Child 0x1003d03f8 (40 bytes)0100000000000000

089af7ffffffffff28033d000100000000000000000000000800000000000000

protocol witness for memorydumper2.P.g () -> () in conformance memorydumper2.StructBigP : memorydumper2.P in memorydumper2 0x10000cc30 (80 bytes)554889e54883ec30488d45e0488b0f4c8b47084c8b4f10488b7f1848894de04c8945e84c894df048897df84889c7488975d8488955d0e8e5fcffff4883c4305d...

Strings:ffffff.

type metadata for memorydumper2.ClassP 0x10039d3f8 (56 bytes)0100000000000000

78d1faffffffffff00000000000000000000000000000000080000000000000010000000000000001800000000000000

protocol witness table for memorydumper2.StructBigP : memorydumper2.P in memorydumper2 0x10039ca78 (24 bytes)e0cb00000100000030cc00000100000080cc000001000000

@8

protocol witness for memorydumper2.P.f () -> () in conformance memorydumper2.StructBigP : memorydumper2.P in memorydumper2 0x10000cbe0 (80 bytes)554889e54883ec30488d45e0488b0f4c8b47084c8b4f10488b7f1848894de04c8945e84c894df048897df84889c7488975d8488955d0e805fdffff4883c4305d...

Strings:ffffff.

@0

protocol witness for memorydumper2.P.h () -> () in conformance memorydumper2.StructBigP : memorydumper2.P in memorydumper2 0x10000cc80 (80 bytes)554889e54883ec30488d45e0488b0f4c8b47084c8b4f10488b7f1848894de04c8945e84c894df048897df84889c7488975d8488955d0e8c5fcffff4883c4305d...

Strings:ffffff.

@16

malloc 0x10140c330 (32 bytes)636c617373000000404040404040404050505050505050506060606060606060

Strings:class

@@@@@@@@PPPPPPPP````````

value witness table for Swift._ArrayBuffer 0x1003b95e0 (216 bytes)7058300001000000d0e22f0001000000a0f300000100000080e30000010000005058300001000000b0e22f0001000000d0da2f0001000000

702a300001000000...

unknown 0x1011ac568 (128 bytes)18d1eb79ff7f0000

386d3e0001000000e02d018aff7f0000

0000000000000000c4c840010100000080000000100000001000000000000000

0000000000000000...

unknown 0x10140c885 (128 bytes)00000090c51a010100000030993c000100000000000000000000000000000000000000000000000000000040c31a01010000000000000000

0000000000088007...

unknown 0x1011d00f8 (128 bytes)08001d0101000000a0101d010100000090701d0101000000601218000100000030802a0001000000b0702f0001000000c02c070001000000

f02c070001000000...

generic type metadata pattern for Swift.IteratorOverOne 0x1003f0045 (323 bytes)0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000...

unknown 0x1011ac4a0 (128 bytes)18c31a0101000000c8c41a01010000000100000000000000307e0f000100000008593c000100000068c51a010100000098f63c0001000000e02d018aff7f0000...

@24 @120 @32 @56 @40 @72

unknown 0x1011ac318 (128 bytes)90c11a010100000040c31a01010000000100000000000000307e0f000100000008593c0001000000e0c31a010100000098f63c0001000000e02d018aff7f0000...

@0

ObjC class Swift._ContiguousArrayStorage<Swift.UInt8> 0x1011ac4c8 (128 bytes)68c51a010100000098f63c0001000000e02d018aff7f0000

000000000000000085c840010100000003000000000000001000000007000000

a800000010000000...

@8

ObjC class Swift._ContiguousArrayStorage1 0x1003cf698 (144 bytes)386d3e000100000008fc3c0001000000e02d018aff7f0000

0000000000000000b58d40010100000003000000000000001000000007000000

a000000010000000...

@48

unknown 0x10140c3b0 (128 bytes)fe8debdc06c7c5ee

0100000001000000a0c41a010100000020bd3b00010000000000000000000000e06f3001010000008f2376928ecfc543

0100000001740000...Strings:ZTUMZTUM

@64 @16

unknown 0x100000001 (128 bytes)faedfe0700000103

000080020000001900000058120000850021000000000019000000480000005f5f504147455a45524f00000000000000

0000000000000000...Strings:

__PAGEZERO__TEXT

@8

type metadata for Swift.UInt8 0x1003bbd20 (32 bytes)0100000000000000

f833f9ffffffffff00000000000000000000000000000000

@24

malloc 0x101306fe0 (48 bytes)00000000000000000000000000000000f934ed8b8ecfc5e1

0100000001000000f8001d010100000080f01c0101000000

@40

unknown 0x1011cf028 (128 bytes)0100000000000000

28ef17ffffffffff0000000000000000000000000000000020bd3b00010000000000000000000000f8033d0001000000

08f01c0101000000...

@72

@32@24

unknown 0x1011cf080 (128 bytes)0100000000000000

d0ee17ffffffffff00000000000000000000000000000000f8033d000100000000000000000000000000000000000000

0000000000000000...

@40 @48 @120 @80 @32

unknown 0x1011cf008 (128 bytes)000000000000000028f01c01010000000100000000000000e0953b00010000000100000000000000

28ef17ffffffffff0000000000000000

0000000000000000...

@56@64

protocol witness for memorydumper2.P.h () -> () in conformance memorydumper2.StructSmallP : memorydumper2.P in memorydumper2 0x10000c900 (32 bytes)554889e54883ec10488b3f488975f8488955f0e818ffffff

4883c4105dc36690

type metadata for memorydumper2.StructSmallP 0x10039d250 (32 bytes)0100000000000000

78d2faffffffffff00000000000000000000000000000000

protocol witness for memorydumper2.P.g () -> () in conformance memorydumper2.StructSmallP : memorydumper2.P in memorydumper2 0x10000c8e0 (32 bytes)554889e54883ec10488b3f488975f8488955f0e828ffffff

4883c4105dc36690

malloc 0x10140c310 (32 bytes)6c61726765000000101010101010101020202020202020203030303030303030

Strings:large

00000000

protocol witness table for memorydumper2.StructSmallP : memorydumper2.P in memorydumper2 0x10039ca60 (24 bytes)c0c8000001000000e0c800000100000000c9000001000000

@0 @16 @8

malloc 0x10140c290 (120 bytes)736d616c6c0000000000000000000000470000000000000050d239000100000060ca39000100000010c340010100000045003f0001000000

ffffffffffffffff...Strings:small

@112 @64 @104 @72 @80 @48@88 @24 @40 @32

Page 81: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

protocol witness for Swift._ArrayBufferProtocol.requestUniqueMutableBackingBuffer (minimumCapacity : Swift.Int) -> Swift._ContiguousArrayBuffer<A.Element>? in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x100073500 (32 bytes)554889e54889f04889d64889c25de90d000000666666662e0f1f840000000000

Strings:ffff.

unknown 0x1011d7028 (128 bytes)10801d010100000028a01d010100000020672f0001000000d0932b000100000010942b0001000000601218000100000050942b0001000000

70942b0001000000...

Swift._ContiguousArrayStorage.__deallocating_deinit 0x1000f7e30 (96 bytes)554889e553504889fb488b03488b7310488b9090000000488b42f8488bb8900000000fb7cf4883c1204881cf0000ffff4881f7ffff000048

21cf4801dfff5068...

protocol witness for Swift._ArrayBufferProtocol.replace <A where A1: Swift.Collection, A.Element == A1.Iterator.Element> (subRange : Swift.Range<Swift.Int>, with : Swift.Int, elementsOf : A1) -> () in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x100073bd0 (112 bytes)554889e54157415641554154534883ec284d89cd4c8945d04989cf4989d44889f34989fe488b7518488d3d9936360031d2e84a552400488b

4d1048894c24104c...Strings:

AWAVAUATSH([A\A]A^A_]

Swift._ContiguousArrayStorage.init () -> Swift._ContiguousArrayStorage<A> 0x1000f88a0 (16 bytes)554889e54889f85dc30f1f8000000000

protocol witness table for memorydumper2.ClassP : memorydumper2.P in memorydumper2 0x10039ca90 (24 bytes)90cf000001000000e0cf00000100000030d0000001000000

protocol witness for memorydumper2.P.f () -> () in conformance memorydumper2.ClassP : memorydumper2.P in memorydumper2 0x10000cf90 (80 bytes)554889e54883ec30488d45e0488b0f4c8b47084c8b4f10488b7f1848894de04c8945e84c894df048897df84889c7488975d8488955d0e805fdffff4883c4305d...

Strings:ffffff.

@0

protocol witness for memorydumper2.P.g () -> () in conformance memorydumper2.ClassP : memorydumper2.P in memorydumper2 0x10000cfe0 (80 bytes)554889e54883ec30488d45e0488b0f4c8b47084c8b4f10488b7f1848894de04c8945e84c894df048897df84889c7488975d8488955d0e8e5fcffff4883c4305d...

Strings:ffffff.

@8

protocol witness for memorydumper2.P.h () -> () in conformance memorydumper2.ClassP : memorydumper2.P in memorydumper2 0x10000d030 (80 bytes)554889e54883ec30488d45e0488b0f4c8b47084c8b4f10488b7f1848894de04c8945e84c894df048897df84889c7488975d8488955d0e8c5fcffff4883c4305d...

Strings:ffffff.

@16

type metadata accessor for Swift.CountableRange<Swift.Int> 0x100181260 (64 bytes)488b05c11c25004885c0752d554889e5488d3db1b12300488d357acf2200488d15b3d02200488d0de4d02200e88fc21000488905901c25005dc3660f1f440000

Strings:u-UH

unknown 0x1011d0008 (128 bytes)000000000000000020101d010100000028701d0101000000601218000100000030802a0001000000b0702f0001000000c02c070001000000

f02c070001000000...

@96 @16 @120 @24

unknown 0x1011d1020 (128 bytes)18201d010100000038501d010100000010672f000100000030932b000100000060402f0001000000a0402f00010000002040300001000000a0e72f0001000000...

@8

lazy protocol witness table accessor for type Swift.CountableRange<Swift.Int> and conformance <A where A: Swift.Comparable, A: Swift._Strideable, A.Stride: Swift.SignedInteger> Swift.CountableRange<A> : Swift.RandomAccessCollection in Swift 0x1002a8030 (32 bytes)554889e5488d3d5dbb1200488d35866213005de9781701000f1f840000000000

@32

associated type metadata accessor for Element in <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x1002f70b0 (16 bytes)554889e55de93681fcff660f1f440000

@40

protocol witness for Swift._ArrayBufferProtocol.init () -> A in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x100072cc0 (48 bytes)554889e553504889fbe842f2fcff488d

05031038004889034889d84883c4085b5dc366666666662e0f1f840000000000

Strings:fffff.

@48

protocol witness for Swift._ArrayBufferProtocol.init (Swift._ContiguousArrayBuffer<A.Element>, shiftedToStartIndex : Swift.Int) -> A in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x100072cf0 (32 bytes)554889e553504889fb4889f7e80f0000

004889034889d84883c4085b5dc36690

@56

protocol witness for Swift._ArrayBufferProtocol._copyContents (subRange : Swift.Range<Swift.Int>, initializing : Swift.UnsafeMutablePointer<A.Element>) -> Swift.UnsafeMutablePointer<A.Element> in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x100072d20 (96 bytes)554889e5415741564155415453504989d64989f74989fc488b194d8b68204889dfe82aa92c004c89e74c89fe4c89f24889d94d89e8e89600

00004989c64889df...Strings:

AWAVAUATSPI[A\A]A^A_]

@64

protocol witness for Swift._ArrayBufferProtocol.subscript.getter : (Swift.Int) -> A.Element in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x1000731a0 (80 bytes)554889e5415741564154534989f64989ff488b1a4c8b61204889dfe8b0a42c004c89ff4c89f64889da4c89e1e87ff7fcff4889dfe837a52c

004c89f85b415c41...Strings:

AWAVATSI[A\A^A_]

@72

protocol witness for Swift._ArrayBufferProtocol.subscript.setter : (Swift.Int) -> A.Element in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x100073450 (80 bytes)554889e5415741564154534989f64989ff488b1a4c8b61204889dfe800a22c004c89ff4c89f64889da4c89e1e8bf31fdff4889df5b415c41

5e415f5de97fa22c...Strings:

AWAVATSI[A\A^A_]

ffffff.

@80

protocol witness for Swift._ArrayBufferProtocol.subscript.materializeForSet : (Swift.Int) -> A.Element in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x1000734a0 (96 bytes)554889e5415741564155415453504989d64989f74989fc488b194d8b68204889dfe8aaa12c004c89e74c89fe4c89f24889d94d89e8e8b63bfdff4989c64989d7...

Strings:AWAVAUATSPI

[A\A]A^A_]

@88

protocol witness for Swift._ArrayBufferProtocol.isMutableAndUniquelyReferenced () -> Swift.Bool in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x100073620 (32 bytes)554889e54889f84889f74889c65de9fd020000666666662e0f1f840000000000

Strings:ffff.

@104

protocol witness for Swift._ArrayBufferProtocol.requestNativeBuffer () -> Swift._ContiguousArrayBuffer<A.Element>? in conformance <A> Swift._ArrayBuffer<A> : Swift._ArrayBufferProtocol in Swift 0x100073b20 (64 bytes)554889e5415653488b1f4c8b76204889dfe83a9b2c004889df4c89f6e81f0000004989c64889dfe8c49b2c004c89f05b415e5dc36666662e0f1f840000000000

Strings:AVSH[A^]fff.

@112

value witness table for Builtin.UnknownObject 0x1003c5908 (184 bytes)90c3320001000000a0c3320001000000c0c3320001000000d0c3320001000000e0c3320001000000f0c332000100000010c4320001000000

30c4320001000000...

type metadata for memorydumper2.StructBigP 0x10039d318 (56 bytes)0100000000000000

08d2faffffffffff00000000000000000000000000000000080000000000000010000000000000001800000000000000

_objc_empty_cache 0x7fff8a012de0 (128 bytes)0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000...

protocol witness for memorydumper2.P.f () -> () in conformance memorydumper2.StructSmallP : memorydumper2.P in memorydumper2 0x10000c8c0 (32 bytes)554889e54883ec10488b3f488975f8488955f0e838ffffff

4883c4105dc36690

type metadata for memorydumper2.MemoryRegion.Child 0x1003d03f8 (40 bytes)0100000000000000

089af7ffffffffff28033d000100000000000000000000000800000000000000

protocol witness for memorydumper2.P.g () -> () in conformance memorydumper2.StructBigP : memorydumper2.P in memorydumper2 0x10000cc30 (80 bytes)554889e54883ec30488d45e0488b0f4c8b47084c8b4f10488b7f1848894de04c8945e84c894df048897df84889c7488975d8488955d0e8e5fcffff4883c4305d...

Strings:ffffff.

type metadata for memorydumper2.ClassP 0x10039d3f8 (56 bytes)0100000000000000

78d1faffffffffff00000000000000000000000000000000080000000000000010000000000000001800000000000000

protocol witness table for memorydumper2.StructBigP : memorydumper2.P in memorydumper2 0x10039ca78 (24 bytes)e0cb00000100000030cc00000100000080cc000001000000

@8

protocol witness for memorydumper2.P.f () -> () in conformance memorydumper2.StructBigP : memorydumper2.P in memorydumper2 0x10000cbe0 (80 bytes)554889e54883ec30488d45e0488b0f4c8b47084c8b4f10488b7f1848894de04c8945e84c894df048897df84889c7488975d8488955d0e805fdffff4883c4305d...

Strings:ffffff.

@0

protocol witness for memorydumper2.P.h () -> () in conformance memorydumper2.StructBigP : memorydumper2.P in memorydumper2 0x10000cc80 (80 bytes)554889e54883ec30488d45e0488b0f4c8b47084c8b4f10488b7f1848894de04c8945e84c894df048897df84889c7488975d8488955d0e8c5fcffff4883c4305d...

Strings:ffffff.

@16

malloc 0x10140c330 (32 bytes)636c617373000000404040404040404050505050505050506060606060606060

Strings:class

@@@@@@@@PPPPPPPP````````

value witness table for Swift._ArrayBuffer 0x1003b95e0 (216 bytes)7058300001000000d0e22f0001000000a0f300000100000080e30000010000005058300001000000b0e22f0001000000d0da2f0001000000

702a300001000000...

unknown 0x1011ac568 (128 bytes)18d1eb79ff7f0000

386d3e0001000000e02d018aff7f0000

0000000000000000c4c840010100000080000000100000001000000000000000

0000000000000000...

unknown 0x10140c885 (128 bytes)00000090c51a010100000030993c000100000000000000000000000000000000000000000000000000000040c31a01010000000000000000

0000000000088007...

unknown 0x1011d00f8 (128 bytes)08001d0101000000a0101d010100000090701d0101000000601218000100000030802a0001000000b0702f0001000000c02c070001000000

f02c070001000000...

generic type metadata pattern for Swift.IteratorOverOne 0x1003f0045 (323 bytes)0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000...

unknown 0x1011ac4a0 (128 bytes)18c31a0101000000c8c41a01010000000100000000000000307e0f000100000008593c000100000068c51a010100000098f63c0001000000e02d018aff7f0000...

@24 @120 @32 @56 @40 @72

unknown 0x1011ac318 (128 bytes)90c11a010100000040c31a01010000000100000000000000307e0f000100000008593c0001000000e0c31a010100000098f63c0001000000e02d018aff7f0000...

@0

ObjC class Swift._ContiguousArrayStorage<Swift.UInt8> 0x1011ac4c8 (128 bytes)68c51a010100000098f63c0001000000e02d018aff7f0000

000000000000000085c840010100000003000000000000001000000007000000

a800000010000000...

@8

ObjC class Swift._ContiguousArrayStorage1 0x1003cf698 (144 bytes)386d3e000100000008fc3c0001000000e02d018aff7f0000

0000000000000000b58d40010100000003000000000000001000000007000000

a000000010000000...

@48

unknown 0x10140c3b0 (128 bytes)fe8debdc06c7c5ee

0100000001000000a0c41a010100000020bd3b00010000000000000000000000e06f3001010000008f2376928ecfc543

0100000001740000...Strings:ZTUMZTUM

@64 @16

unknown 0x100000001 (128 bytes)faedfe0700000103

000080020000001900000058120000850021000000000019000000480000005f5f504147455a45524f00000000000000

0000000000000000...Strings:

__PAGEZERO__TEXT

@8

type metadata for Swift.UInt8 0x1003bbd20 (32 bytes)0100000000000000

f833f9ffffffffff00000000000000000000000000000000

@24

malloc 0x101306fe0 (48 bytes)00000000000000000000000000000000f934ed8b8ecfc5e1

0100000001000000f8001d010100000080f01c0101000000

@40

unknown 0x1011cf028 (128 bytes)0100000000000000

28ef17ffffffffff0000000000000000000000000000000020bd3b00010000000000000000000000f8033d0001000000

08f01c0101000000...

@72

@32@24

unknown 0x1011cf080 (128 bytes)0100000000000000

d0ee17ffffffffff00000000000000000000000000000000f8033d000100000000000000000000000000000000000000

0000000000000000...

@40 @48 @120 @80 @32

unknown 0x1011cf008 (128 bytes)000000000000000028f01c01010000000100000000000000e0953b00010000000100000000000000

28ef17ffffffffff0000000000000000

0000000000000000...

@56@64

protocol witness for memorydumper2.P.h () -> () in conformance memorydumper2.StructSmallP : memorydumper2.P in memorydumper2 0x10000c900 (32 bytes)554889e54883ec10488b3f488975f8488955f0e818ffffff

4883c4105dc36690

type metadata for memorydumper2.StructSmallP 0x10039d250 (32 bytes)0100000000000000

78d2faffffffffff00000000000000000000000000000000

protocol witness for memorydumper2.P.g () -> () in conformance memorydumper2.StructSmallP : memorydumper2.P in memorydumper2 0x10000c8e0 (32 bytes)554889e54883ec10488b3f488975f8488955f0e828ffffff

4883c4105dc36690

malloc 0x10140c310 (32 bytes)6c61726765000000101010101010101020202020202020203030303030303030

Strings:large

00000000

protocol witness table for memorydumper2.StructSmallP : memorydumper2.P in memorydumper2 0x10039ca60 (24 bytes)c0c8000001000000e0c800000100000000c9000001000000

@0 @16 @8

malloc 0x10140c290 (120 bytes)736d616c6c0000000000000000000000470000000000000050d239000100000060ca39000100000010c340010100000045003f0001000000

ffffffffffffffff...Strings:small

@112 @64 @104 @72 @80 @48@88 @24 @40 @32

Protocols

Page 82: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Protocols

data 1

data 2

data 3

type metadata

witness table

Page 83: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Protocols

data 1

data 2

data 3

type metadata

witness table

method f

method g

method h

Page 84: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Protocol Method Call

method f

method g

method h

let p: Protocol = …p.g()

table = p[4]methodf = table[offset]methodf(p)

Page 85: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Protocols

box pointer

type metadata

witness table

method f

method g

method h

data 1

data 2

data 3

data 4

data 5

Page 86: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Enumsenum SimpleEnum { case A, B, C, D, E}struct SimpleEnumHolder { var a: SimpleEnum var b: SimpleEnum var c: SimpleEnum var d: SimpleEnum var e: SimpleEnum}SimpleEnumHolder(a: .A, b: .B, c: .C, d: .D, e: .E)

Page 87: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Enumsenum SimpleEnum { case A, B, C, D, E}struct SimpleEnumHolder { var a: SimpleEnum var b: SimpleEnum var c: SimpleEnum var d: SimpleEnum var e: SimpleEnum}SimpleEnumHolder(a: .A, b: .B, c: .C, d: .D, e: .E)

unknown 0x7fff5fbff250 (5 bytes)0001020304

Page 88: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Enumsenum IntRawValueEnum: Int { case A = 1, B, C, D, E}struct IntRawValueEnumHolder { var a: IntRawValueEnum var b: IntRawValueEnum var c: IntRawValueEnum var d: IntRawValueEnum var e: IntRawValueEnum}IntRawValueEnumHolder(a: .A, b: .B, c: .C, d: .D, e: .E)

Page 89: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Enumsenum IntRawValueEnum: Int { case A = 1, B, C, D, E}struct IntRawValueEnumHolder { var a: IntRawValueEnum var b: IntRawValueEnum var c: IntRawValueEnum var d: IntRawValueEnum var e: IntRawValueEnum}IntRawValueEnumHolder(a: .A, b: .B, c: .C, d: .D, e: .E)

unknown 0x7fff5fbff210 (5 bytes)0001020304

Page 90: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Enumsenum StringRawValueEnum: String { case A = "whatever", B, C, D, E}struct StringRawValueEnumHolder { var a: StringRawValueEnum var b: StringRawValueEnum var c: StringRawValueEnum var d: StringRawValueEnum var e: StringRawValueEnum}StringRawValueEnumHolder(a: .A, b: .B, c: .C, d: .D, e: .E)

Page 91: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Enumsenum StringRawValueEnum: String { case A = "whatever", B, C, D, E}struct StringRawValueEnumHolder { var a: StringRawValueEnum var b: StringRawValueEnum var c: StringRawValueEnum var d: StringRawValueEnum var e: StringRawValueEnum}StringRawValueEnumHolder(a: .A, b: .B, c: .C, d: .D, e: .E)

unknown 0x7fff5fbff1f0 (5 bytes)0001020304

Page 92: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Enumsenum OneAssociatedObjectEnum { case A(AnyObject) case B, C, D, E}struct OneAssociatedObjectEnumHolder { var a: OneAssociatedObjectEnum var b: OneAssociatedObjectEnum var c: OneAssociatedObjectEnum var d: OneAssociatedObjectEnum var e: OneAssociatedObjectEnum}OneAssociatedObjectEnumHolder( a: .A(NSObject()), b: .B, c: .C, d: .D, e: .E)

Page 93: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Enums

malloc 0x1015069d0 (80 bytes)0000000000000000000000000000000000000000000000000000000000000000ead95996ff7f0000f09bff89ff7f0000

00000000000000000000000000000000...

@72

CreateStringFromFileSystemRepresentationByAddingPercentEscapes.hexchars 0x7fff9659d9ea (128 bytes)696e697400616c6c6f63576974685a6f6e653a00657863657074696f6e576974684e616d653a726561736f6e3a75736572496e666f3a005f

616c6c6f63005f69...Strings:

initallocWithZone:

exceptionWithName:reason:userInfo:_alloc_initcopy

copyWithZone:retainCount

retainautorelease

countobje

@32

-[NSObject init] 0x7fff89ff9bf0 (16 bytes)554889e54889f85dc390909090909090

@40

ObjC class NSObject 0x7fff79ebd0f0 (40 bytes)18d1eb79ff7f0000

0000000000000000d06950010100000003000000010000005603200101000000

@16

OBJC_METACLASS_$_NSObject 0x7fff79ebd118 (40 bytes)18d1eb79ff7f0000f0d0eb79ff7f0000

900e40010100000007000000020000009403200101000000

@0

unknown 0x100000003 (128 bytes)fe0700000103000080020000001900000058120000850021000000000019000000480000005f5f504147455a45524f000000000000000000

0000000000000000...Strings:

__PAGEZERO__TEXT

@24

unknown 0x101200356 (128 bytes)000018cbeb79ff7f0000f147200101000000213b200101000000f8c6eb79ff7f00009847397bff7f

00000000000000000000000000000000

0000000009a00700...

@32@8

@0

malloc 0x101400e90 (144 bytes)00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033db5996ff7f0000dba0ff89ff7f0000...

@16

unknown 0x101200394 (128 bytes)0700000010c7eb79ff7f0000a1382001

010000000000000000000000f8c6eb79ff7f0000c047397bff7f000000000000

000000000000000000000000f0032001...

@32

Instance of NSObject 0x101400440 (16 bytes)f0d0eb79ff7f0000

0000000000000000

@0

malloc 0x1014013c0 (40 bytes)40044001010000000000000000000000020000000000000004000000000000000600000000000000

@0

Page 94: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Enumsenum ManyAssociatedObjectsEnum { case A(AnyObject) case B(AnyObject) case C(AnyObject) case D(AnyObject) case E(AnyObject)}struct ManyAssociatedObjectsEnumHolder { var a: ManyAssociatedObjectsEnum var b: ManyAssociatedObjectsEnum var c: ManyAssociatedObjectsEnum var d: ManyAssociatedObjectsEnum var e: ManyAssociatedObjectsEnum}ManyAssociatedObjectsEnumHolder( a: .A(NSObject()), b: .B(NSObject()), c: .C(NSObject()), d: .D(NSObject()), e: .E(NSObject()))

Page 95: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Enums

Instance of NSObject 0x101305160 (16 bytes)f0d0eb79ff7f0000

0000000000000000

ObjC class NSObject 0x7fff79ebd0f0 (40 bytes)18d1eb79ff7f0000

000000000000000030a720010100000003000000020000005603200101000000

@0

OBJC_METACLASS_$_NSObject 0x7fff79ebd118 (40 bytes)18d1eb79ff7f0000f0d0eb79ff7f0000

305330010100000007000000020000009403200101000000

@0

unknown 0x101200356 (128 bytes)000018cbeb79ff7f

0000d148200101000000013c200101000000f8c6eb79ff7f00009847397bff7f

00000000000000000000000000000000

0000000009a00700...

@32

malloc 0x10120a730 (80 bytes)00000000000000000000000000000000d1d95996ff7f0000af7cff89ff7f0000ead95996ff7f0000f09bff89ff7f0000

00000000000000000000000000000000...

@16

malloc 0x101305330 (144 bytes)00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033db5996ff7f0000dba0ff89ff7f0000...

CreateStringFromFileSystemRepresentationByAddingPercentEscapes.hexchars 0x7fff9659d9d1 (128 bytes)6465616c6c6f630066696e616c697a650072656c6561736500696e697400616c6c6f63576974685a6f6e653a00657863657074696f6e5769

74684e616d653a72...Strings:deallocfinalizerelease

initallocWithZone:

exceptionWithName:reason:userInfo:_alloc_initcopy

copyWithZone:retainCount

reta

-[NSObject dealloc] 0x7fff89ff7caf (10 bytes)554889e55de92b90

0000

Instance of NSObject 0x1013046d0 (16 bytes)f0d0eb79ff7f0000

0000000000000000

@0

Instance of NSObject 0x1013058e0 (16 bytes)f0d0eb79ff7f0000

0000000000000000

@0

Instance of NSObject 0x101302790 (16 bytes)f0d0eb79ff7f0000

0000000000000000

@0

@8

@16

@0

unknown 0x101200394 (128 bytes)0700000010c7eb79ff7f000081392001

010000000000000000000000f8c6eb79ff7f0000c047397bff7f000000000000

000000000000000000000000f0032001...

@32

Instance of NSObject 0x101303470 (16 bytes)f0d0eb79ff7f0000

0000000000000000

@0

malloc 0x1013053c0 (73 bytes)e058300101000000000000000000000060513001010000000100000000000000902730010100000002303030303002007034300101000000

0300000000000000...Strings:00000

@16 @64 @0 @32 @48

@16 @24

@72

CreateStringFromFileSystemRepresentationByAddingPercentEscapes.hexchars 0x7fff9659d9ea (128 bytes)696e697400616c6c6f63576974685a6f6e653a00657863657074696f6e576974684e616d653a726561736f6e3a75736572496e666f3a005f

616c6c6f63005f69...Strings:

initallocWithZone:

exceptionWithName:reason:userInfo:_alloc_initcopy

copyWithZone:retainCount

retainautorelease

countobje

@32

-[NSObject init] 0x7fff89ff9bf0 (16 bytes)554889e54889f85dc390909090909090

@40

Page 96: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Wrapping Up

Page 97: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Wrapping Up

Page 98: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

01AA2C5EFF001101

0000000000000000

00000000000000FF

A0F31C228A177013...

00000001000000000000000100000008

00000001000000100000000100000018

.

.

.…

Wrapping Up

Page 99: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Wrapping Up4200000000000000 900400cce67f0000 800300cce67f0000 400100cce67f0000

0x0000000000000042

0x00007fe6cc000490

0x00007fe6cc000380

0x00007fe6cc000140

………… ………… …………💥

Page 100: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Wrapping Up struct WithPadding { char a; char b; char c; short d; char e; int f; char g; long h; }; WithPadding withPadding = { 1, 2, 3, 4, 5, 6, 7, 8 };

unknown 0x7fff5fbff288 (24 bytes)010203000400050006000000070000000800000000000000

Page 101: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Wrapping Up

class (isa)

retain counts

stored properties

stored properties

Object

class (isa)

Class

Page 102: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Wrapping Up

box pointer

type metadata

witness table

method f

method g

method h

data 1

data 2

data 3

data 4

data 5

Page 103: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Wrapping Upenum SimpleEnum { case A, B, C, D, E}struct SimpleEnumHolder { var a: SimpleEnum var b: SimpleEnum var c: SimpleEnum var d: SimpleEnum var e: SimpleEnum}SimpleEnumHolder(a: .A, b: .B, c: .C, d: .D, e: .E)

unknown 0x7fff5fbff250 (5 bytes)0001020304

Page 104: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Wrapping Up

Instance of NSObject 0x101305160 (16 bytes)f0d0eb79ff7f0000

0000000000000000

ObjC class NSObject 0x7fff79ebd0f0 (40 bytes)18d1eb79ff7f0000

000000000000000030a720010100000003000000020000005603200101000000

@0

OBJC_METACLASS_$_NSObject 0x7fff79ebd118 (40 bytes)18d1eb79ff7f0000f0d0eb79ff7f0000

305330010100000007000000020000009403200101000000

@0

unknown 0x101200356 (128 bytes)000018cbeb79ff7f

0000d148200101000000013c200101000000f8c6eb79ff7f00009847397bff7f

00000000000000000000000000000000

0000000009a00700...

@32

malloc 0x10120a730 (80 bytes)00000000000000000000000000000000d1d95996ff7f0000af7cff89ff7f0000ead95996ff7f0000f09bff89ff7f0000

00000000000000000000000000000000...

@16

malloc 0x101305330 (144 bytes)00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033db5996ff7f0000dba0ff89ff7f0000...

CreateStringFromFileSystemRepresentationByAddingPercentEscapes.hexchars 0x7fff9659d9d1 (128 bytes)6465616c6c6f630066696e616c697a650072656c6561736500696e697400616c6c6f63576974685a6f6e653a00657863657074696f6e5769

74684e616d653a72...Strings:deallocfinalizerelease

initallocWithZone:

exceptionWithName:reason:userInfo:_alloc_initcopy

copyWithZone:retainCount

reta

-[NSObject dealloc] 0x7fff89ff7caf (10 bytes)554889e55de92b90

0000

Instance of NSObject 0x1013046d0 (16 bytes)f0d0eb79ff7f0000

0000000000000000

@0

Instance of NSObject 0x1013058e0 (16 bytes)f0d0eb79ff7f0000

0000000000000000

@0

Instance of NSObject 0x101302790 (16 bytes)f0d0eb79ff7f0000

0000000000000000

@0

@8

@16

@0

unknown 0x101200394 (128 bytes)0700000010c7eb79ff7f000081392001

010000000000000000000000f8c6eb79ff7f0000c047397bff7f000000000000

000000000000000000000000f0032001...

@32

Instance of NSObject 0x101303470 (16 bytes)f0d0eb79ff7f0000

0000000000000000

@0

malloc 0x1013053c0 (73 bytes)e058300101000000000000000000000060513001010000000100000000000000902730010100000002303030303002007034300101000000

0300000000000000...Strings:00000

@16 @64 @0 @32 @48

@16 @24

@72

CreateStringFromFileSystemRepresentationByAddingPercentEscapes.hexchars 0x7fff9659d9ea (128 bytes)696e697400616c6c6f63576974685a6f6e653a00657863657074696f6e576974684e616d653a726561736f6e3a75736572496e666f3a005f

616c6c6f63005f69...Strings:

initallocWithZone:

exceptionWithName:reason:userInfo:_alloc_initcopy

copyWithZone:retainCount

retainautorelease

countobje

@32

-[NSObject init] 0x7fff89ff9bf0 (16 bytes)554889e54889f85dc390909090909090

@40

Page 105: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Wrapping Up• Data laid out linearly • Padded for alignment • Class instances have isa and refcounts first • Protocol values have 3 words of inline data • Larger data is boxed • Dynamic method dispatch uses vtables • Swift is powerful: all C-ish evil stuff available • Can learn a lot by poking around

Page 106: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM

Wrapping Up

👍

Page 107: Swift Memory Layout - GOTO Conference · Memory Vacuum tubes Mercury (or gin) delay line Magnetic core DRAM