Стек

https://habr.com/ru/post/464463/ Resonder Chain
https://habr.com/ru/post/578752/ GCD
https://www.vadimbulavin.com/static-dynamic-frameworks-and-libraries/ Static libs, dynamic
Когда мы создаем тип значения, такой как структура, система сохраняет его в области памяти, называемой стеком, которая непосредственно управляется и оптимизируется процессором. Когда функция объявляет переменную, переменная будет сохранена в стеке. Когда функция вызывается, стек автоматически освобождает переменную. Таким образом, стек очень прост в управлении и эффективен, поскольку он напрямую управляется процессором, скорость очень высока. Стек использует кэш первого уровня.

Стек — это область оперативной памяти, которая создаётся для каждого потока. Он работает в порядке LIFO (Last In, First Out), то есть последний добавленный в стек кусок памяти будет первым в очереди на вывод из стека. Каждый раз, когда функция объявляет новую переменную, она добавляется в стек, а когда эта переменная пропадает из области видимости (например, когда функция заканчивается), она автоматически удаляется из стека. Когда стековая переменная освобождается, эта область памяти становится доступной для других стековых переменных.

Из-за такой природы стека управление памятью оказывается весьма логичным и простым для выполнения на ЦП; это приводит к высокой скорости, в особенности потому, что время цикла обновления байта стека очень мало, т.е. этот байт скорее всего привязан к кэшу процессора. Тем не менее, у такой строгой формы управления есть и недостатки. Размер стека — это фиксированная величина, и превышение лимита выделенной на стеке памяти приведёт к переполнению стека. Размер задаётся при создании потока, и у каждой переменной есть максимальный размер, зависящий от типа данных. Это позволяет ограничивать размер некоторых переменных (например, целочисленных), и вынуждает заранее объявлять размер более сложных типов данных (например, массивов), поскольку стек не позволит им изменить его. Кроме того, переменные, расположенные на стеке, всегда являются локальными.

В итоге стек позволяет управлять памятью наиболее эффективным образом — но если вам нужно использовать динамические структуры данных или глобальные переменные, то стоит обратить внимание на кучу.

До тех пор, пока размер типа значения известен во время компиляции и он не содержит / не содержится рекурсивно ссылочным типом, ему не потребуется подсчет ссылок, и его срок службы будет статическим - равным сроку службы его области видимости. Он будет полностью выделен в стеке, и когда область будет освобождена, то же самое произойдет и с типом значения. Отсутствие накладных расходов на подсчет ссылок и наличие выделения стека значительно повышают производительность.

Memory Layout - later

Если размер вашего типа значения не может быть определен во время компиляции (из-за протокола / общего требования), или если ваш тип значения рекурсивно содержит / содержится ссылочным типом (помните, что замыкания также являются ссылочными типами), то для этого потребуется выделение кучи. Это может варьироваться от того, что это вообще не проблема, до того, что ваша структура будет работать экспоненциально хуже, чем если бы это был класс.

Тип значения, полностью выделенный стеком, не нуждается в подсчете ссылок, но тип значения с внутренними ссылками, к сожалению, унаследует эту способность.

Поскольку все ссылочные типы требуют подсчета ссылок, увеличение количества свойств класса классов не изменит время выполнения этого алгоритма, поскольку простого увеличения количества ссылок родительской ссылки будет достаточно, чтобы сохранить его внутренние ссылки живыми.

Однако типы значений, естественно, не имеют подсчета ссылок. Если ваш тип значения содержит внутренние ссылки, для его копирования потребуется увеличить количество ссылок на его дочерние элементы - не на первый, не на второй, а буквально на каждый из них.