# Copy On Write (CoW)

1. [Understanding Swift Copy-on-Write mechanisms](https://medium.com/@lucianoalmeida1/understanding-swift-copy-on-write-mechanisms-52ac31d68f2f)

### Зачем CoW нужна

|[Value Types](/5%20Swift/5.3%20DataRepresentations/5.3.1%20DataTypes/5.3.1.4%20ValueTypes/) (хранятся в [стеке](/3%20Memory%20and%20Concurrency/3.1%20Memory/3.1.2%20RandomAccessMemory/3.1.2.2%20Stack.md)) | [Reference Types](/5%20Swift/5.3%20DataRepresentations/5.3.1%20DataTypes/5.3.1.3%20ReferenceTypes/) (хранятся в [куче](/3%20Memory%20and%20Concurrency/3.1%20Memory/3.1.2%20RandomAccessMemory/3.1.2.3%20Heap.md))|
|------------|------------|
| Основные типы данных: Int, Bool, Char | Closure |
| [Struct](/5%20Swift/5.3%20DataRepresentations/5.3.1%20DataTypes/5.3.1.4%20ValueTypes/5.3.1.4.2%20Struct.md) | [Class](/5%20Swift/5.3%20DataRepresentations/5.3.1%20DataTypes/5.3.1.3%20ReferenceTypes/Class/Class.md)|
| Enum | [Function](/2%20ComputerScience/2.2%20Languages/2.2.2%20Paradigm/2.2.2.1%20Declarative/2.2.2.1.1%20FunctionalProgramming(FP).md) |
| Float, Double | |
| [Tuple](/5%20Swift/5.3%20DataRepresentations/5.3.1%20DataTypes/5.3.1.4%20ValueTypes/5.3.1.4.4%20CollectionsAndTuple/5.3.1.4.4.3%20Tuple.md) | |
| [Collections](/5%20Swift/5.3%20DataRepresentations/5.3.1%20DataTypes/5.3.1.4%20ValueTypes/5.3.1.4.4%20CollectionsAndTuple/5.3.1.4.4.1%20Collections.md): [Set](/5%20Swift/5.3%20DataRepresentations/5.3.1%20DataTypes/5.3.1.4%20ValueTypes/5.3.1.4.4%20CollectionsAndTuple/5.3.1.4.4.2%20AssociatedArray.md), String, Array, [Dictionary](/5%20Swift/5.3%20DataRepresentations/5.3.1%20DataTypes/5.3.1.4%20ValueTypes/5.3.1.4.4%20CollectionsAndTuple/5.3.1.4.4.2%20AssociatedArray.md) | |

Основным отличием [ссылочных типов](/5%20Swift/5.3%20DataRepresentations/5.3.1%20DataTypes/5.3.1.3%20ReferenceTypes/) от типов значений является то, что первые передаются по ссылкам, в то время как вторые копируются.

> На скорость копирования влияет то, что примитивные типы, такие как целые числа и числа с плавающей запятой, хранятся в регистрах ЦП, и при их копировании нет необходимости обращаться к оперативной памяти. Но большинство расширяемых типов Swift, таких как строки, массивы, наборы и словари, используют другую логику - копируются при записи(copy-on-write).

У этого есть ряд своих плюсов таких как то, что типы значений работают быстрее, потому что хранятся на [стеке](/3%20Memory%20and%20Concurrency/3.1%20Memory/3.1.2%20RandomAccessMemory/3.1.2.2%20Stack.md), а не в [куче](/3%20Memory%20and%20Concurrency/3.1%20Memory/3.1.2%20RandomAccessMemory/3.1.2.3%20Heap.md), используют [статическую диспетчеризацию](/5%20Swift/5.6%20MethodDispatch/5.6.2%20Static(direct)Dispatch.md) и прочее. 

Однако можно задаться вопросом “а зачем копировать данные, если мы их не меняем?”. Пример, представьте себе массив с 1000 элементами внутри него: если вы скопируете этот массив в другую переменную, Swift должен будет скопировать все 1000 элементов, даже если два массива окажутся одинаковыми.

Эта проблема решается с помощью копирования при записи: когда вы указываете две переменные на один и тот же массив, они обе указывают на одни и те же базовые данные. А само полное копирование происходит только в момент мутации. 

Таким образом, откладывая операцию копирования до тех пор, пока она действительно не понадобится, [Swift](/5%20Swift/) может гарантировать, что работа не будет выполнена впустую.

---

[3.1.2.3 Heap Theme](./3.1.2.3%20Heap.md) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [3.1.3 Reference Theme Folder](../3.1.3%20ReferenceCounting/)

