Slide 1

Slide 1 text

Copyright © Bitkey Inc. All rights reserved. Pointer ͱ޲͖߹͏ Swift Expands! #2 Masatoshi Tsushima

Slide 2

Slide 2 text

Copyright © Bitkey Inc. All rights reserved. ௡ౡ խढ़ Masatoshi Tsushima 2004 ιϑτ΢ΣΞ։ൃͱͷग़ձ͍ WebαΠτ΍ܞଳΞϓϦΛ࡞ͬͯ༡ΜͰ͍·ͨ͠ 2018ळ Bitkeyʹࢀը ౰ॳ͸bitkey platformͷ։ൃΛ୲౰ ओʹGoͰαʔόαΠυΛ։ൃ 2019ळ ϑΝʔϜ΢ΣΞνʔϜΛ্ཱͪ͛ bitlock LITEͷϑΝʔϜ΢ΣΞΛ಺੡Խ ݱࡏʹଓ͘։ൃελΠϧΛߏங 2020Ն ୈೋੈ୅ϩοΫσόΠεͷ։ൃ ಺੡Λલఏͱͨ͠ϑΝʔϜ΢ΣΞ։ൃ 2021य़ϦϦʔε 2022Ն Individual contributor (?) Android/iOS/FlutterɺσόΠεQA༻ΞϓϦɺࣾ಺ ࢓༷ͷඪ४ԽɺMakefile৬ਓɺCI͓͡͞Μ

Slide 3

Slide 3 text

Copyright © Bitkey Inc. All rights reserved. ૊ࠐΈͰόάͷݪҼͱ͍͑͹

Slide 4

Slide 4 text

Copyright © Bitkey Inc. All rights reserved. p = &var

Slide 5

Slide 5 text

Copyright © Bitkey Inc. All rights reserved. p++

Slide 6

Slide 6 text

Copyright © Bitkey Inc. All rights reserved. *p

Slide 7

Slide 7 text

Copyright © Bitkey Inc. All rights reserved. ෳࡶͳૢ࡞ͰόάΔ

Slide 8

Slide 8 text

Copyright © Bitkey Inc. All rights reserved. ͦͯ͠ͳ͔ͥಈ͘

Slide 9

Slide 9 text

Copyright © Bitkey Inc. All rights reserved. ͱࢥͬͨΒ ϦϦʔεϏϧυͰಈ͔ͳ͍

Slide 10

Slide 10 text

Copyright © Bitkey Inc. All rights reserved. C Ҏ֎Ͱݟͳ͍ͩΖͱࢥͬͯ·ͨ͠ ૊ࠐΈ͔Β iOS ։ൃʹҟಈ͢Δ·Ͱ͸ var x = 1 let p = UnsafePointer(&x) print("\(p.pointee), \(p)")

Slide 11

Slide 11 text

Copyright © Bitkey Inc. All rights reserved. ·͓ͨલ͔

Slide 12

Slide 12 text

Copyright © Bitkey Inc. All rights reserved. Pointer ͱ޲͖߹͏

Slide 13

Slide 13 text

Copyright © Bitkey Inc. All rights reserved. Q: ࣮ࡍͷॴϙΠϯλͬͯԿʹ࢖͏ͷʁ A: ओʹόΠτྻͷૢ࡞ ● C ݴޠͷ഑ྻ ● Swift ͷ Array/Data ಡΈସ͑ɾॻ͖׵͑ɾసૹɾಠࣗͷ؅ཧ…

Slide 14

Slide 14 text

Copyright © Bitkey Inc. All rights reserved. Data ͔Β Int ʹ͍ͨ͠ ݕࡧ͢ΔͱΑ͘ग़ͯ͘Δ΍ͭ import Foundation let data = Data([1, 2, 3, 4]) let x = data.withUnsafeBytes { $0.load(as: UInt16.self) } print(x) // Output: 513

Slide 15

Slide 15 text

Copyright © Bitkey Inc. All rights reserved. Data ͔Β Int ʹ͍ͨ͠ load ͷ୅ΘΓʹ OpaquePointer Λܦ༝ͤͯ͞Έͨ import Foundation let data = Data([1, 2, 3, 4]) let x = data.withUnsafeBytes { UnsafePointer(OpaquePointer($0.baseAddress!)).pointee } print(x) // Output: 513 खݩͰ͸ -O -emit-assembly Ͱಉ݁͡Ռ

Slide 16

Slide 16 text

Copyright © Bitkey Inc. All rights reserved. ͪͳΈʹ: Swift ͷΤϯσΟΞϯͷૢ࡞ λʔήοτͱҟͳΔͳΒٯॱʹ͢Δ print(x) // Apple Silicon ͸ 513 print(x.bigEndian) // 258 print(x.littleEndian) // 513 print(x.bigEndian.bigEndian) // 513 print(x.littleEndian.littleEndian) // 513

Slide 17

Slide 17 text

Copyright © Bitkey Inc. All rights reserved. Struct ͸Ͳ͏ͳͷʁ ಉ͡ΞʔΩςΫνϟؒͳΒେৎ෉Έ͍ͨ Alignment Λௐ੔͢Δखஈʹ͚ܽΔ

Slide 18

Slide 18 text

Copyright © Bitkey Inc. All rights reserved. ༷ʑͳܕ ● UnsafePointer ● UnsafeMutablePointer ● UnsafeRawPointer ● UnsafeMutableRawPointer ● UnsafeBufferPointer ● UnsafeMutableBufferPointer ● UnsafeRawBufferPointer ● UnsafeMutableRawBufferPointer Mutable ॻ͖׵͑Մೳ Buffer ௕͞ (count) ෇͖ Raw ૯শܕ () ແ͠

Slide 19

Slide 19 text

Copyright © Bitkey Inc. All rights reserved. Unsafe ͱ͸ʁ ● UnsafePointer ● UnsafeMutablePointer ● UnsafeRawPointer ● UnsafeMutableRawPointer ● UnsafeBufferPointer ● UnsafeMutableBufferPointer ● UnsafeRawBufferPointer ● UnsafeMutableRawBufferPointer

Slide 20

Slide 20 text

Copyright © Bitkey Inc. All rights reserved. C ͷͱ͖Λࢥ͍ग़ͯ͠ΈΔ ࡾେҙຯෆ໌ͳڍಈ͢ΔόάͷݪҼ ● ະ֬อ ○ ࢦࣔ͢͠ઌ͕֬อ͞Ε͍ͯͳ͍͔΋ ● ະॳظԽ ○ ॳظԽ͞Ε͍ͯͳ͍͔΋ ● ະ։์ ○ ։์͞Εͳ͍͔΋

Slide 21

Slide 21 text

Copyright © Bitkey Inc. All rights reserved. ະ֬อ ֬อͤͣʹ࢖͏ var x: Int = 10 let p = UnsafePointer(&x) print(p.advanced(by: 10).pointee)

Slide 22

Slide 22 text

Copyright © Bitkey Inc. All rights reserved. ະ֬อ ֬อͤͣʹ࢖͏ var x: Int = 10 let p = UnsafePointer(&x) print(p.advanced(by: 10).pointee) ਖ਼ৗऴྃͪ͠Ό͏Μͩͳ͜Ε͕…

Slide 23

Slide 23 text

Copyright © Bitkey Inc. All rights reserved. ະ֬อ ֬อͤͣʹ࢖͏ ಈ͔͢۩߹ʹΑͬͯ͸ͪΌΜͱࢮ͵

Slide 24

Slide 24 text

Copyright © Bitkey Inc. All rights reserved. ະ֬อ ൣғ֎ʹΞΫηε͢Δ

Slide 25

Slide 25 text

Copyright © Bitkey Inc. All rights reserved. ະ֬อ ൣғ֎ʹΞΫηε͢Δ import Foundation let data = Data([1, 2, 3, 4]) let x = data.withUnsafeBytes { let op = OpaquePointer($0.baseAddress!.advanced(by: 10)) return UnsafePointer(op).pointee } print(x) load ͷ count νΣοΫΛආ͚Δͱਖ਼ৗऴྃ͢Δ

Slide 26

Slide 26 text

Copyright © Bitkey Inc. All rights reserved. ະॳظԽ initialize ͠ͳ͍

Slide 27

Slide 27 text

Copyright © Bitkey Inc. All rights reserved. ະ։์ deallocate ͠ͳ͍ for _ in 1...1_000_000 { let _ = UnsafeMutablePointer .allocate(capacity: 1_000) }

Slide 28

Slide 28 text

Copyright © Bitkey Inc. All rights reserved. ະ։์ 8 GiB ֬อͨ͠͸ͣͰ͸…ʁ

Slide 29

Slide 29 text

Copyright © Bitkey Inc. All rights reserved. ؀ڥม਺ MallocScribble=1 ֬อͨ͠ϝϞϦʹॻ͖ࠐΉ ։์͞Εͨ஋ʹґଘ͠ͳ͍Α͏ʹ ద౰ͳ஋ (0x55) Λॻ͖ࠐΉ

Slide 30

Slide 30 text

Copyright © Bitkey Inc. All rights reserved. ະ։์ 7.67 × 10243 = 8,235,599,790

Slide 31

Slide 31 text

Copyright © Bitkey Inc. All rights reserved. ·ͱΊ: Swift ͷ Pointer ● Data ͱ Int ͷ૬ޓม׵͕୅දྫ ● Ͳͷ͋ͨΓ͕ Unsafe ʁ ○ ະ֬อ: ࢦࣔ͢͠ઌ͕֬อ͞Ε͍ͯͳ͍͔΋ ○ ະॳظԽ: ॳظԽ͞Ε͍ͯͳ͍͔΋ ○ ະ։์: ։์͞Εͳ͍͔΋ ● ਖ਼͘͠࢖Θͳ͍ͱͲ͏ͳΔʁ ○ ίϯύΠϧ͸௨Δ ○ Ϋϥογϡͨ͠Γ͠ͳ͔ͬͨΓϝϞϦΛ৯͍ͭͿͨ͠Γ͢Δ

Slide 32

Slide 32 text

Copyright © Bitkey Inc. All rights reserved. ࢀߟจݙ ● Safely manage pointers in Swift - WWWDC20 ● [Swift] IntͱDataͷ૬ޓม׵ #Swift - Qiita ● ʲSwift5ʳDataΛInt΍DoubleͳͲͱ૬ޓม׵͢Δํ๏ – Ώ͖ͬͿΖ͙ ● ios - how to convert Data to Int in swift - Stack Overflow ● ૉ੖Β͍͠SwiftͷϙΠϯλܕͷղઆ #Swift - Qiita

Slide 33

Slide 33 text

Copyright © Bitkey INC. All rights reserved.