Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток господа! Задался вот я таким вопросом: Как по-шустрому сделать копию коллекции? Без лупа. Что то вроде CopyMemory. Элементы колекции могут быть разные, в том числе, valid types(int, string...), UDT, другие коллекции. Естественно, что если элемент коллекции сам является обьектом то в коллекции будет хранится ничто иное как ссылка на него. В таком случае , даже получить размер обьекта для передачи его CopyMemory , не представляется возможным. Тогда как же? Сами форточки с этим как то справляются... Как? Вопрос ведь даже не в типах, елси взять просто коллекцию, и скопировать по первому элементу(objptr), то имеем казус : созданы 2 коллекции, одна пустая (4 байта), другая с элементами(8 байт), копируем обьект... Под новую коллекцию память уже выделена, как в нее влезут лишние 4 байта? Corrupted memory? Да-с... Вот такая вот дума ... Буду признателен за идеи и высказывания. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2004, 19:03 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
В пределах одного адресного пространства? Что хочешь делать с массивами? Со строками? С объектами? (а со всем остальным проблем нет) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2004, 20:59 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
на чём пишем, Магнус? неужели на Басике??? ;)))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2004, 21:07 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
2 Лох Позорный В смысле, адресного пространства одного приложения? Да. Скопировать хочу. Просто сделать копию обьекта. Независимую, т.е не референс а именно самостоятельная копия. на чём пишем, Магнус? неужели на Басике??? ;)))) Жись такая :), Дрюм, и не говори... Последние пол-года на всем пишу, вперемешку: и Басик, и С# и Басика.Нет На данный момент, мелкая аппликуха. Я думал Васик больше не увижу, но эти клиенты блин... Чтоб у них Memory Corrupted >:) Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2004, 21:26 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
Скопировать хочу. Sel col1 = col2 Что есть (по твоему) копия массива? Строки (ну видимо то же, что и массива)? И, самое противное, что такое (по-твоему) копия COM-объекта? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2004, 21:30 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
Sel col1 = col2 Не есть ли это копия ссылки на обьект? Как уже сказал, обьект комплексный, т.е. не просто массив, с ним то как раз все понятно. ЯЭлементы колекции могут быть разные, в том числе, valid types(int, string...), UDT, другие коллекции. Естественно, что если элемент коллекции сам является обьектом то в коллекции будет хранится ничто иное как ссылка на него Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2004, 21:41 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
если элементами коллекции будут произвольные типы, то тут хоть на плюсах пиши, хоть на VB, скорость будет одинаковая +/- 1%, ибо основные потери будут на работу с VARIANT, а эта фишка по-любому API-шная (да и вряд ли VB на 3-х строках сгенерит код, худший чем сишный) да и в чем проблема-то??? ради 3-х строк такое обсуждение если бы надо было массивы копировать, то кинул бы код на сях для молниеносного создания копии, именно через memcpy. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2004, 02:44 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
2 vdimas Вы по моему сильно переоцениваете способности VB, доступ к элементам коллекции в нем сделан жутко медленно, вставка гораздо быстрее. vdimas (да и вряд ли VB на 3-х строках сгенерит код, худший чем сишный) Не поверите, умудряется. К примеру простой цикл добавления елементов в listbox, если сделан средствами VB, т.е. Add... довольно медленный. Но если вместо этого добавлять элементы с помошью прямого сообщения контролу, то работает немного быстрее, особенно заметно на большом количестве элементов. vdimas да и в чем проблема-то??? ради 3-х строк такое обсуждение проблема: Цикл, по перебору элементов, три члена каждого элемента сами являются коллекциями в которых может быть от 10 до 20К элементов. В результате имеем вложенные циклы - не самая быстрая операция и без того медленного VB. В принципе я уже сделал, протестировал на средних значениях и результатом вообщем-то удовлетворен. Но все же на будущее хотелось бы знать варианты. vdimas если бы надо было массивы копировать, то кинул бы код на сях для молниеносного создания копии, именно через memcpy. С массивом понятно, CopyMemory отрабатывает без проблем, потому что размер массива может быть переопределен под новые данные перед копированием. Вопрос в другом: как быть в этом случае с коллекцией? Под нее память выделяется при создании, что случится при копировании в нее тем же способом коллекции с тысячами элементов? И как это вообще будет выглядеть, если коллекция содержит обычные типы вперемежку с указателями? буду очень признателен за разьяснения. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2004, 16:00 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
С массивом понятно Интересно, что тебе с массивом понятно? Особенно, например, с массивом Variant'ов, где может быть все что угодно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2004, 16:18 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
Я имел ввиду массив стандартных типов, массив вариантов - не лучшее решение на VB.А с чего вдруг такая агрессия? Как уже говорил, COpymemory копирует массив стандартных типов без проблем. Особенно, например, с массивом Variant'ов, где может быть все что угодно Я кстати, об этом и спрашивал, если вы внимательно читали топик. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2004, 16:35 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
А с чего вдруг такая агрессия? Какая-такая агрессия? Просто пытаюсь понять о чем спич авторЦикл, по перебору элементов, три члена каждого элемента сами являются коллекциями в которых может быть от 10 до 20К элементов Что такое член элемента? Какой член? Какого элемента? Эти три члена - в фиксированном месте родительской коллекции? Вложенные коллекции (которые члены) только простые типы содержат? Может тебе с помощью MemCpy скопировать родительскую коллекцию, потом вложенные (если они в фиксированных местах) еще раз скопировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2004, 17:32 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
И как это вообще будет выглядеть, если коллекция содержит обычные типы вперемежку с указателями? А мне не изменяет память, что коллекция только Variant'ы и содержит? И простые типы все равно в Variant упаковываются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2004, 17:44 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
Какая-такая агрессия? Просто пытаюсь понять о чем спич Интересно, что тебе с массивом понятно? ?? Да вот эта, вообщем то. Замнем для ясности. ОК? Что такое член элемента? Какой член? Какого элемента? Каждый элемент родительской коллекции - класс, классам свойственно иметь члены :) . В данном случае 3 из них также являются коллекциями, (элементы которых - UDT содержащие другие классы и простые типы), а остальные стандартные типы. Это если интересна полная иерарахия. Может тебе с помощью MemCpy скопировать родительскую коллекцию, потом вложенные (если они в фиксированных местах) еще раз скопировать? Так я об этом и спрашивал в начале! Как это реально будет выглядеть в памяти? Для MemCpy нужно указывать рамер исходной структуры. подсчитывать его через всю иерархию? Но ведь там же только пойнтеры. Или передавать только размер родительской коллекции(структуры)? Пробовал с обычными коллекциями, при передаче размера структуры(коллекции), функция отрабатывает, но при завершении валится весь проэкт. Т.е. вероятно Corrupted memory. НЕт? А мне не изменяет память, что коллекция только Variant'ы и содержит? И простые типы все равно в Variant упаковываются? В Variant? Точно? Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2004, 19:35 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
Замнем для ясности. ОК? Ну ок И как всегда меня превратно поняли... Каждый элемент родительской коллекции - класс Объект? У тебя каждый элемент колекции объект? И ты говоришь о MemCpy??? Пойду пить вотку... чего та я не панимаю в этой жизни ваапсче и в VB в частности... Как это реально будет выглядеть в памяти? Тебе нужно описание структуры Variant'а? ПыСы Имхо тебе нужно прочитать книжку по OLE Automation (а сначала по COM) ПыПыСы Ничего личного. ПыПыПыПыСы Алаверды ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2004, 00:42 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
чтоб меня неправильно не поняли - я ни накого ни хател наехать Так... окуел малость... Сорь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2004, 00:44 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
Имхо тебе нужно прочитать книжку по OLE Automation (а сначала по COM) Двумя руками за. Спасибо. ПСы: а если коротко? Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2004, 00:50 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
>А мне не изменяет память, что коллекция только Variant'ы и содержит? И простые типы все равно в Variant упаковываются? >>В Variant? Точно? Абсолютно. Из ВБ можно сохранить данные в бинарный файл, при этом если сохраняется пользовательская структура, то автоматически сохраняются простые типы данных, вложенные структуры и строки, т.е. сохраняются указанные в "поинтерах" данные. Загрузить можно в такую же структуру. Доп.инфа в инете. З.Ы. Не уверен, что данный фокус понимает коллекции. З.Ы.2 ИМХО в данной задаче выбранная реализация через коллекции не верна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2004, 08:57 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
Из ВБ можно сохранить данные в бинарный файл, при этом если сохраняется пользовательская структура, то автоматически сохраняются простые типы данных, вложенные структуры и строки, т.е. сохраняются указанные в "поинтерах" данные. Загрузить можно в такую же структуру. Доп.инфа в инете. Спасибо за наводку, но увы инфу найти не смог. Был бы очень признателен за более точные кооердинаты или ссылку. З.Ы.2 ИМХО в данной задаче выбранная реализация через коллекции не верна. Можно услышать аргументы? Алтернативные варианты? Спасибо. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2004, 13:31 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
все-таки не до конца понятно, что же нужно автору Особенно совсем непонятен рассказ про 4 и 8 байт Идет ли речь об объекте класса Collection ? Если да, то выскажу пару соображений 1) кусок кода Dim p1 As Collection Dim p2 as Collection Set p1 = New Collection Set p2 = p1 Создает НЕ копию коллекции, а ВТОРУЮ ССЫЛКУ на физически один объект Копия, это когда измения, проделанные с копией не отражаются на первом экземпляре. В Вышеприведенном коде это не так. 2) Стуктура класса Collection не раскрывается MS, наружу он смотрит интерфейсами. В соответствии с рассыпанными по инету предположениями представляет собой двусвязный список. Это объясняет почему а) добавление быстрее индексированного доступа и б) безнадежно расчитывать на "копирование одной командой типа RtlMoveMemory". 3) быстрое копирование действительно на основе самописных коллекций построенных на основе массивов переменной длины. Примеров масса поищи типа clsObjArray, clsObjColletion, clsIndexCollection и т.п. Такой класс в две строки обучается копировать себя в другой экземпляр Успехов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2004, 21:04 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
2 Victosha Я уже писал Скопировать хочу. Просто сделать копию обьекта. Независимую, т.е не референс а именно самостоятельная копия. Особенно совсем непонятен рассказ про 4 и 8 байт Тут я немного в сторону зарулил, прошу прощвния. Копия, это когда измения, проделанные с копией не отражаются на первом экземпляре Это я прекрасно понимаю, устал повторять, что с этого разговор и начался. И, это был не мой код а Лоха Позорного.(черт, ну и ник выбрал, неудобно даже к человеку так обращатся...) Спасибо за хинт по структуре коллекции. Далее, на самописные коллекции я уже поглядывал, с массивами организованными через MAlloc или IUnknown. Оба интерфейса, при реализации, практически эквивалентны в быстродействии, равно быстрее VB коллекции по все параметрам. Если сделать полностью свою архитектуру, можно будет и копировать. Что я искал, это более простой метод, не требующий переработки классов. Такой класс в две строки обучается копировать себя в другой экземпляр Опять же, вы забываете о структуре упомянутой мною коллекции. Все элементы - классы, каждый со своей сложной структурой. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2004, 22:02 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
IUnknown применительно к данной теме пользуют исключительно для управления счетчиком ссылок на объекты. Про две строки - художественный оборот. Но сильно упростит процедуру копирования Вашего класса, если Вы предположите, что все классы, описывающие экземпляры объектов, содержащихся в Вашей коллекции реалируют один и тот же интерфейс - типа IClone или ICopy. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2004, 23:20 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
IUnknown применительно к данной теме пользуют исключительно для управления счетчиком ссылок на объекты. Имелось ввиду его использование как альтернатива MAlloc. Но сильно упростит процедуру копирования Вашего класса, если Вы предположите, что все классы, описывающие экземпляры объектов, содержащихся в Вашей коллекции реалируют один и тот же интерфейс - типа IClone или ICopy. Т.е. разработка собственных интерфейсов и внедрение их в классы. Конечный результат смотрится довольно неплохо, но это все время, а его нет, как и бюджета. Разве что дома, для себя. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2004, 23:41 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
IUnknown использовать как альтернативу MAlloc нельзя - у них в принципе разные цели и задачи. Malloc - это абстакция управления памятью, IUnknown - (придуманная почти исключительно специально для Васька) абстракция доступа к объявленным для внешнего доступа элементам класса. Его задача - имея ссылку на экземпляр объекта уметь спрашивать класс, какие он может применить к этому объекту методы. Между делом еще счетчиком ссылок управлять - типа мне больше этот объект не нужен - вычерни меня из списка. В общем - инструмент поддержки позднего связывания. ЗЫ вот еще раз перечитал набор сообщений - есть подозрение, что КОПИРОВАНИЕ коллекций Вам в действительности не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 01:47 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
IUnknown - (придуманная почти исключительно специально для Васька) Кыш! Если Васек - это Basic, то не IUnknown для него придуман, а IDispatch В общем - инструмент поддержки позднего связывания. Аналогично. Позднее связывание - IDispatch ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 02:06 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=32413483&tid=2170046]: |
0ms |
get settings: |
11ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
72ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
2ms |
| others: | 228ms |
| total: | 438ms |

| 0 / 0 |
