Сообщение от Жека
Ещё стал интесесен вопрос юзания оператора foreach. На каждый форыч создаётся новый объект-итератор.
Если не предполагается пробегать по той же коллекции внутри другого форыча, то можно бы сделать кэшированный итератор, для которого вместо new будет вызываться iterator.reset (this) - сбрасываем индекс в ноль или ссылку на first.
В манки-юнити хочу сделать такой кэш-вариант для списков, которые не торчат наружу в юзерский код.
|
Да, итератор создается каждый раз. Но это совершенно ничего не значит. Создание объекта ничего не стоит. Да, серьезно, ничего не стоит. Аллокация памяти в дотнете нереально быстрая (как и в яве, например), ибо память то уже аллоцирована одним большим куском. Вот когда сборщик мусора начинает работать, то огромное кол-во объектов может стать для него проблемой. Но речь идет о десятках гигабайт и миллиардах объектов в секунду. К тому же аллокация и сборщик работают только на ссылочных типах, значимые то хранятся на стеке. Память то там не аллоцируется, и сборщик потом такие объекты не собирает. И итератор такой распостраненной коллекции как List<T>, например, объявлен как struct, а значит вся эта фигня с кешированием ничего не даст.
http://referencesource.microsoft.com...661cf752ff3f44