Показать сообщение отдельно
Старый 22.08.2016, 20:19   #9
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: Decompiled Unity5.3 (c#)

Сообщение от Жека Посмотреть сообщение
Ещё стал интесесен вопрос юзания оператора foreach. На каждый форыч создаётся новый объект-итератор.
Если не предполагается пробегать по той же коллекции внутри другого форыча, то можно бы сделать кэшированный итератор, для которого вместо new будет вызываться iterator.reset (this) - сбрасываем индекс в ноль или ссылку на first.

В манки-юнити хочу сделать такой кэш-вариант для списков, которые не торчат наружу в юзерский код.
Да, итератор создается каждый раз. Но это совершенно ничего не значит. Создание объекта ничего не стоит. Да, серьезно, ничего не стоит. Аллокация памяти в дотнете нереально быстрая (как и в яве, например), ибо память то уже аллоцирована одним большим куском. Вот когда сборщик мусора начинает работать, то огромное кол-во объектов может стать для него проблемой. Но речь идет о десятках гигабайт и миллиардах объектов в секунду. К тому же аллокация и сборщик работают только на ссылочных типах, значимые то хранятся на стеке. Память то там не аллоцируется, и сборщик потом такие объекты не собирает. И итератор такой распостраненной коллекции как List<T>, например, объявлен как struct, а значит вся эта фигня с кешированием ничего не даст.
http://referencesource.microsoft.com...661cf752ff3f44
__________________
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо h1dd3n за это полезное сообщение:
pax (22.08.2016), St_AnGer (22.08.2016), Жека (23.08.2016)