Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Вниз

Ищу процедуру из группы Finalize+Initialize   Найти похожие ветки 

 
Тимохов   (2004-03-02 12:37) [0]

Не подскажите есть ли такая процедура которая бы по участку памяти делала увеличение счетчика ссылок. Например, finalize уменшьшает счетчик ссылок для области, содержащей динамические объекты (дл. строки, дин. массивы, интерфейсы), а вот искомый мной метод должен делать наоборот, увеличивать счетчик ссылок.

Ясно, что документированной процедуры нет. Может есть недокументированная?

Поясню, зачем это надо.
Есть область памяти (массив) из записей, которые содержат строки. Нужно ее СКОПИРОВАТЬ. Сейчас приходится делать это циклом с копированием каждого элемента. Здорово было бы сделать move, а потом, увеличить счетчики ссылок. Вообще пример со строками это частность - в общем случае могут быть дин. массивы, интерфейсы и т.д.


 
Digitman   (2004-03-02 12:39) [1]


> Здорово было бы сделать move, а потом, увеличить счетчики
> ссылок


сч-к ссылок на что ? на оригинал ? на копию ?


 
Тимохов   (2004-03-02 12:40) [2]

На копию


 
Alex Konshin   (2004-03-02 12:43) [3]

Так посмотри в реализацию в System.pas, увидишь, что такая процедура есть.
Мне лень сейчас копать (уже 5 часов утра), но если интересно, можешь помотреть в моем юните Arrays, там я точно это где-то делаю. Кстати, это и есть реализация дин.массива объектов (а не ссылок на объекты!), ну и еще туда индексирование через AVLtree прикручено.


 
Тимохов   (2004-03-02 12:51) [4]

Alex Konshin © (02.03.04 12:43) [3]

Да есть
procedure _AddRef;
procedure _AddRefArray;
procedure _AddRefRecord;
Это я видел. Вопрос такой почему это все без параметров.
Думаю, понимаю, почему, т.к. надо на асме запихивать параметры.

Все-таки это имхо очень низкоуровнево и недокументировано совсем.
Сделать то можно, но что будет дальше?

Может подскажите, где вообще это finalize описан? _Finalize вижу, а finalize нет. Ясно, что finalize вызывает _finalize, но где это прописано?


 
Alex Konshin   (2004-03-02 12:55) [5]

Вот что я делаю у себя:

// Инкрементирует счетчики ссылок для полей String,Variant и т.п.
procedure TObjArrayItem.IncrementRefCounters; assembler;
asm
push ebx
push esi
mov ebx,eax
mov esi,eax
@@loop:
mov esi,[esi]
mov edx,[esi].vmtInitTable
mov esi,[esi].vmtParent
test edx,edx
je @@skip
call System.@AddRefRecord;
mov eax,ebx
@@skip:
test esi,esi
jne @@loop
pop esi
pop ebx
end;

Почему так, а не иначе - не помню и соображалка уже спать хочет.


 
Тимохов   (2004-03-02 13:01) [6]

Спасибо - очень познавательно.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.012 c
4-43959
Zin
2004-01-05 13:57
2004.03.14
Как прочитатать кластер или сектор на диске под NTFS?


1-43625
Plt
2004-03-02 11:59
2004.03.14
Проблема с ComboBox.ItemIndex


14-43752
VDen
2004-02-18 19:05
2004.03.14
О погоде на английском


14-43862
Style
2004-02-21 15:52
2004.03.14
Люди, а как крякнуть Norton Antivirus 2004?


3-43344
Rumba
2004-02-16 16:36
2004.03.14
FIBPlus 5.08 master-detail





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский