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