Общий консенсус в отношении программирования на Swift (по состоянию на май 2018 г., Swift 4.1, Xcode 9.3) заключается в том, что следует отдавать предпочтение структурам, если только ваша логика явно не требует общей ссылки на объект.
Как мы знаем, проблема со структурами заключается в том, что они передаются по значению, поэтому при передаче структуры в функцию или возврате из нее создается копия. Если у вас большая структура (скажем, с 12 свойствами), то такое копирование может дорого обойтись.
Это обычно защищают люди, говорящие, что быстрый компилятор и/или LLVM могут исключать копии (т. е. передавать ссылку на структуру, а не копировать ее) и должны делать копию только в том случае, если вы действительно изменяете структуру.
Это все хорошо, но об этом всегда говорят в теоретических терминах: «В качестве оптимизации LLVM может исключить копии» и тому подобное.
Мой вопрос: кто-нибудь может сказать нам, что на самом деле происходит? Действительно ли компилятор игнорирует копии или это просто теоретическая будущая оптимизация, которая может когда-нибудь появиться? (Например, компилятор C# теоретически может исключать копии структур, но на самом деле он никогда этого не делает, и Microsoft рекомендует не использовать структуры для объектов размером более 16 байт [1])
Если Swift действительно удаляет копии структур, есть ли какое-то объяснение или эвристика относительно того, делает ли это и когда?
Примечание. Я говорю о пользовательских структурах, а не о встроенных в stdlib вещах, таких как массивы и словари.
[1] https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/choosing-between-class-and-struct