Sobes.tech
Junior — Middle

Existuje možnosť implementovať vlastný mechanizmus Copy-on-Write v projekte?

sobes.tech AI

Odpoveď od AI

Áno, na iOS je možné implementovať vlastný mechanizmus Copy-on-Write (CoW), ktorý optimalizuje využitie pamäte a zvyšuje výkon pri práci s meniteľnými dátovými štruktúrami.

Myšlienka CoW je, že pri kopírovaní objektu sa v skutočnosti vytvorí iba referencia na pôvodné dáta, a skutočné kopírovanie dát nastáva až vtedy, keď sa pokúsime objekt zmeniť (t.j. počas mutácie).

Príklad implementácie CoW pre štruktúru s poľom:

struct MyData {
    private class Storage {
        var array: [Int]
        init(array: [Int]) {
            self.array = array
        }
        func copy() -> Storage {
            return Storage(array: array)
        }
    }

    private var storage: Storage

    init(array: [Int]) {
        storage = Storage(array: array)
    }

    var array: [Int] {
        get { storage.array }
        set {
            if !isKnownUniquelyReferenced(&storage) {
                storage = storage.copy()
            }
            storage.array = newValue
        }
    }
}

Tu isKnownUniquelyReferenced kontroluje, či objekt storage nie je zdieľaný s inými inštanciami, a ak áno, pred zmenou sa vytvorí kópia.