![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| ivashkanet |
|
||||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Как можно увеличить размер массива?
Задача: Есть некоторый массив объектов, изначально пустой. Нужно получить эффективную возможность добавления нового элемента в массив. Задачу можно решить так:
Но поэлементное присваивание не очень эффективно. Хотелось бы что нибудь вроде
Но при использовании Clases = Temp в массив Clases передается не только элементы массива Temp, но и его размер. |
||||
|
|||||
| Illuminaty |
|
|||
![]() /*Антон Захаров*/ ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1238 Регистрация: 19.3.2005 Где: Россия, Казань Репутация: 1 Всего: 56 |
A готовый класс ArrayList не подойдет?
|
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Спасибо, Illuminaty, очень даже подошло!
P.S. Пока разбирался с ArrayList, нашел класс Hashtable, который подошел еще больше! Спаибо. |
|||
|
||||
| Illuminaty |
|
|||
![]() /*Антон Захаров*/ ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1238 Регистрация: 19.3.2005 Где: Россия, Казань Репутация: 1 Всего: 56 |
Пожалуйста
Заходи еще |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Эффективно увеличивать размер массива невозможно, если только массив не растёт с упреждающей скоростью. Поясню на примере: есть массив длиной 10 элементов. Надо добавить 11-й элемент. В памяти все 10 элементов идут друг за другом (так организован массив). Чтобы добавить 11-й, система создаёт новый пустой массив длиной в 11 элементов, копирует каждый элемент (что там у нас - ссылки на объекты C#, указатели на объекты C++, объекты С++, или что бы там ни было) в новый массив, и добавляет 11-й элемент в пустое место в конце массива. Вот так вот. Для оптимизации можно использовать алгоритм упреждающего резервирования: при выделении памяти на N элементов, всегда оставлять место для M дополнительных элементов. Именно так работает контейнер vector<T> в С++. Именно так организуется коллекция ArrayList в C#.
-------------------- ![]() |
|||
|
||||
| ivashkanet |
|
||||||||||||||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
mr.DUDA, большое спасибо. Вещь не просто классная, она крутая Так вот, с ее помощью дезассемблировал класс ArrayList. Вот основные процедуры:
Процедура добавляет новый элемент к массиву. Если у нас зарезервировано место в массиве(а резервируется прилично), то все пучком. Если нет то тоже не беда: работает EnsureCapacity. (Хоть это и функция (return int), лучше назвать её процедера, так как я не думаю, что возвращаемое значение можно где-то использовать
То же все предельно просто. Та самая
упреждающая скорость. Причем не хилая: 2-х кратный запас ячеек. (Так как они все null , то потери памяти нет (я не специалист но мне так кажется. Поправте меня, пожалуйста, если я ошибаюсь.)
Свойство-функция (метод или как они там называются), которая реально и увеличивает размер (емкость) массива.
Метод перенаправляет нас на другой перегруженный метод, который копирует все элементы одного массива в другой (почему нельзя было обойтись без него не знаю. Скорее всего проблема с доступом (я в этом пока не очень) первый метод public, в второй internal).
Очень интересная процедура, как она работает и где это она extern -- не известно. Но ясно одно -- как бы там она не работала, она работает, в среднем, в полтора раза быстрее, чем поэлементное копирование. Выводы: 1. Основной прирост скорости работы происходит из-за роста массива с упреждающей скоростью. 2. Используется "неизвестная" процедура Copy. Может это ноу-хау M$, хотя на мой взгляд ноу-хау в таких элементарных вопросах (копирование массивов) уже давно нет. Скорее всего она написана каким-то "хитрым кодом", и скорее всего написать его с помощью C# нельзя P.S. Надеюсь статья кому нибудь понравится. Еще раз спасибо, mr.DUDA, за Reflector. Знаю ее всего 2 дня, а уже люблю. P.P.S. Исправьте меня, если я где-то не прав |
||||||||||||||
|
|||||||||||||||
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Ну место-то для объектов выделяется. Если это структуры, то память будет выделена сразу по N байт для M структур, если объекты - то по 4 байта для M объектов. Может и не 4, т.к. что там реально в Array хранится - одному CLR'у известно.
Скорее всего дёргается memcpy ... -------------------- ![]() |
||||
|
|||||
| -ser- |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 1.2.2005 Репутация: 5 Всего: 13 |
как generic альтернативу ArrayList можно использовать List<T>
я полагал что у обоих механизм добавления элемента работает аналогично. но вот что они пишут
допустим, но читаем дальше
так почему в первом случае они не упоминали "and copying"? я подумал, может в случае с генериками они используют внутренний индекс? хотя тогда почему бы его не использовать и в случае уменьшения размера. -------------------- "Тонкая, однако, работа." |
||||
|
|||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
||||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Классно!!! Я получил 1 балл репутации. Но только вот что это, и кто мне его дал??? (Ну и естественно за что?) Объясните, пожалуйста. P.S. Что мне мешает создать нового юзера и "наплюсить" себу репутации???? |
|||
|
||||
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Это я тебе плюс поставил за пример, как создавать собственные snippets для Visual Studio 2005... Никакого отношения к текущей теме этот плюс не имеет. Чтобы посмотреть, кто и за что тебе ставит плюс, просто нажми на ссылку "Репутация" у себя.
Тебе помешает администрация. За такие игры реально получить полный БАН по IP-адресу. Играть с этим не советую... -------------------- ![]() |
||||
|
|||||
| arilou |
|
|||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
ivashkanet, вот такая вот фигня, ой, атрибут
вобщем,
означает, что реализация метода находится "внутри" инфраструктуры фреймворка, и написана она в unmanaged коде. Можешь скачать ROTOR (реализация CLR, доступная под лицензией shared source), и посмотреть. Там очень много методов "MethodImplOptions.InternalCall" http://msdn.microsoft.com/net/sscli/ |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Спасибо, arilou, но мне хватит и .Net. А в дебри CLR я пока лезть не хочу.
Маленький (в смысле новичок) ещё |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Страшный, вопиющий
Но это мое первое сообщение/тема на форуме |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |