İçeriğe geç

MemoryLayout kullanımı

Merhabalar bu yazımda Swift ile nesnelerin, değişkenlerin hafıza değerlerini bize veren MemoryLayout kullanımını göstereceğim.

Hafıza kullanımı programlamada çok önemlidir. Yanlış kullanımlar, çakışan adres gösterimleri, gereksiz yer tutan değişkenler, aşırı yüklemeden kaynaklı hafıza sızıntıları gibi olaylar alt seviye programlama dillerinde büyük zorluklar çıkarır. Ancak Swift gibi modern yeni diller bu işlemleri kendi hallederek sizi büyük yükten kurtarmış olur.

Dilin modern olmasına rağmen hafıza işlemlerinin bazı durumlarını manuel olarak kullanmamızı ve işlemleri gerçekleştirmemize olanak sağlar. MemoryLayout yapısıda bu işlemleri gerçekleştirirken bize size,stride,aligment gibi değişken tipi hafıza bilgileri vermekte.

Aşağıda kullanımını görebilirsiniz.

struct point {
    var x:CGFloat
    var y:CGFloat
}

var obj = point(x: 2.1, y: 4.8)

MemoryLayout.size(ofValue: obj) // 16
MemoryLayout.alignment(ofValue: obj) // 8
MemoryLayout.stride(ofValue: obj) // 16

MemoryLayout<Character>.size // 9

Generics olarak aldığı değerin byte olarak [UInt8] değerini döndüren yazarsak. Burada gelen değerin hafızada kapladığı yeri MemoryLayout ile öğrendiğimizi görmekteyiz.

func 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))
        })
    })
}

bytes(of: 0xAF)
bytes(of: 0b11000000)

 

Tarih:SwiftSwift 3

Bu yazı yorumlara kapalı.

Copyright © 2021 Kenan Atmaca