Назначение любого struct
(например, Array
) приводит к полному копированию содержимого структуры.Там нет особого поведения для Array
.Буфер, в котором хранятся элементы Array
, на самом деле не является частью структуры.Указатель на этот буфер, хранящийся в куче, является частью структуры Array
, что означает, что при назначении указатель буфера копируется, но он все еще указывает на тот же буфер.
Все операции мутации в Array
выполняют проверку, чтобы определить, есть ли в буфере уникальная ссылка.Если так, то алгоритм продолжается.В противном случае создается копия буфера, и указатель на новый буфер сохраняется в этом экземпляре Array
, затем алгоритм продолжает работу, как и ранее.Это называется Копировать при записи (CoW).Обратите внимание, что это не автоматическая функция всех типов значений.Это просто реализованная вручную функция нескольких стандартных типов библиотек (например, Array
, Set
, Dictionary
, String
и другие).Вы могли бы даже реализовать это самостоятельно для своих собственных типов.
Когда происходит CoW, он не делает какое-либо глубокое копирование.Он будет копировать значения, что означает:
- В случае типов значений (
struct
, enum
, кортежи) значения являются самими кортежами struct
/ enum
/.В этом случае глубокая и мелкая копии - это одно и то же. - В случае ссылочных типов (
class
) копируемое значение - ссылка .Ссылочный объект не копируется.Один и тот же объект указывается как старой, так и скопированной ссылкой.Таким образом, это мелкая копия.