Comments 9
Нечто похожее есть в Python
На хабре есть хорошая статья про Cow в Rust Rust: От &str к Cow.
Признаться, я раньше недоумевал, почему тип называется "корова"
Да, действительно, это нечто подобное, но это все же для rust, поэтому сложно наткнуться, когда ищешь именно для swift. Вообще идея написания была в том, что в русском сегменте мало информации именно для swift. Но механизм COW везде один, это правда
Нет, не один. Вышеописанный механизм зависит от языка и накладывает ограничения, если требуется вызывать функции на других языках. Тогда как COW на уровне MMU (через mmap() с MAP_PRIVATE) универсален. Более того, так как он оперирует на уровне страниц виртуальной памяти, для больших объектов, в которых изменяется лишь незначительная часть данных, он существенно эффективней.
я ответил, что объем памяти не изменится и ошибся
Обе переменные ссылаются на одну область памяти
Т.е. ошибки всё-таки не было?
Можете объяснить непросвещённому: для чего мы используем функцию isKnownUniquelyReferenced
? Я правильно понимаю, что в самом начале эта функция вернёт false
, т.к. значение ещё не проинициализировалось?
Хм... а Вы пробовали создать сторонний бокс на основе стороннего значения? Судя по логике, у него должен быть совершенно другой адрес, ведь это другой объект. Я конечно не претендую на хорошее понимание механизма, но мне показалось, что результат кода ниже получится достаточно странным, как считаете?
struct Test {
var x: Int
}
let val = Test(x: 5)
// Ну и используем наш Box
var box = Box(x: val)
var box2 = box
// ====
let otherValue = Test(x: 10)
var otherBox = Box(x: otherValue)
address(&box.value)
address(&box2.value)
address(&otherBox.value)
Результат:
address: 6129561136
address: 6129561136
address: 6129561136
Copy-on-write