Pull to refresh

Comments 9

На хабре есть хорошая статья про Cow в Rust Rust: От &str к Cow.

Признаться, я раньше недоумевал, почему тип называется "корова"

Да, действительно, это нечто подобное, но это все же для rust, поэтому сложно наткнуться, когда ищешь именно для swift. Вообще идея написания была в том, что в русском сегменте мало информации именно для swift. Но механизм COW везде один, это правда

Нет, не один. Вышеописанный механизм зависит от языка и накладывает ограничения, если требуется вызывать функции на других языках. Тогда как COW на уровне MMU (через mmap() с MAP_PRIVATE) универсален. Более того, так как он оперирует на уровне страниц виртуальной памяти, для больших объектов, в которых изменяется лишь незначительная часть данных, он существенно эффективней.

я ответил, что объем памяти не изменится и ошибся

Обе переменные ссылаются на одну область памяти

Т.е. ошибки всё-таки не было?

Была, так как у собственных структур нет механизма COW по дефолту, поэтому оно копировалось, а не ссылалось на одну область памяти

Да, забавно. При том, что если эту структуру поместить, например, в Array, то COW опять сработает.

Можете объяснить непросвещённому: для чего мы используем функцию 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

Sign up to leave a comment.

Articles