Форум: "Потрепаться";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
ВнизDelphi vs. C++ Найти похожие ветки
← →
vuk © (2004-09-08 15:09) [440]to Суслик © (08.09.04 14:56) [432]:
>Вот скажи с обозначенной выше точки зрения - чем для меня
>отличается скажем строка и интерфейс с точки зрения управления
>их жизнью?
Объект реализующий интерфейс управляет временем жизни сам на основании счетчика ссылок. Строка - не объект и поэтому ее временем жизни управляет RTL.
← →
Суслик © (2004-09-08 15:13) [441]
> Акуличев Дмитрий (08.09.04 15:03) [436]
Ладно, решил пояснить внятно.
Есть свой датасет.
Построен на такой структуре данных:
type
TData = array[0..оченьмного] of variant;
PData = ^TData;
Все хранится как
data:PData;
Это по сути последовательно расположенные строки.
Т.е. чтобы взять поле П строки С нужно взять data^[C*КолСтр + П].
Естесно есть всякие операции:
групиировка, сортировка, join и т.д.
В этом случае часто приходится делать move памяти с последующим аккуратным учетом памяти. И часто приходится делать addref областям памяти. Т.к. _addref недокументированная, то приходится делать просто через копирование
destination.data^[...] := source.data^[...].
Легче было бы скопировать через move, затем просто сделать addref скопированной области памяти.
Надеюсь понятно.
Проше не приводить реплики, не относящиеся к сути вопроса.
Ясно, что для серьезных задач (порядка полумиллиона и более строк) такой подход слаб. В этом случае про variant вообще надо запыть - эмулирвоать это иными способами.
Но для поставленных передо мной задач такой подход удовлетворяет как по скорости, так и по объему занимаемой памяти.
← →
Акуличев Дмитрий (2004-09-08 15:15) [442]
> Суслик © (08.09.04 15:01) [434]
Ну ёлки-палки.
Указатель же типизированный!
var
p: PRec;
begin
New(p);
p^.s := stringof("0", 10);
Dispose(p);
end;
"Я тебе умный вешш скажю, толко ты не абыжайся" (ц) Мимино
Учите матчасть!
← →
Суслик © (2004-09-08 15:15) [443]
> Акуличев Дмитрий (08.09.04 15:08) [438]
> Причина проста: средств для инициализации/финализации нет,
> для них были сделаны встроенные процедуры.
> Для копирования есть присваивание с приведением типов. Зачем
> еще вводить в язык лишние сущности?
Вот! Очень хороший и граммотный ответ. Наверное в этом и есть дело.
> vuk © (08.09.04 15:09) [440]
В данном контексте (в контексте клиента конструкции, т.е. пользователя) имхо эти отличия несущественны.
← →
Суслик © (2004-09-08 15:17) [444]
> Акуличев Дмитрий (08.09.04 15:15) [442]
Как ты извините (глагол забыл) со своей матчастью:)))
Это был пример, того как это вообще МОЖНО использоваться, чтобы вопросов по контексту не было, т.е. пояснить о чем я говорю.
---------------------------------------------------------
Все зачмырили. И даже хорошую описанную конструкцию не смей испошльзовать :)))))
← →
Суслик © (2004-09-08 15:19) [445]
> Акуличев Дмитрий (08.09.04 15:15) [442]
На самом деле ты скорее всего мне уже дал ответ в 438.
Действительно - наверное не хотели они лишние сущности плодить, вот и не стали описывать addref.
Согласен с тобой, что его всегда можно (не всегда удобно, правда) заменить ":="
← →
Акуличев Дмитрий (2004-09-08 15:24) [446]
> Легче было бы скопировать через move, затем просто сделать
> addref скопированной области памяти.
Не легче.
Подумай, как была бы реализована такая addref и был бы от неё реальный выигрыш.
← →
Суслик © (2004-09-08 15:25) [447]
> Подумай, как была бы реализована такая addref и был бы от
> неё реальный выигрыш.
Блин (извините) :))
ты еще не понял, что на уже есть :)))
открой system
найди _initialize, пойди 4-5 строчек ниже, увидишь _addref.
Она есть
Она хорошо работает, только параметры приходится передавать в asm.
Я ей непользуюсь, т.к. она НЕдокументированная. Была бы документирвоанная - пользовался бы.
← →
Акуличев Дмитрий (2004-09-08 15:34) [448]А на матчасть ты зря обижаешься. Оно есть рулез, хотя и не всегда приятный.
Вот только что выкинул в помойку почти готовый RTF парсер, потому что нашёл описание Text Object Model.
Было очень жалко и нецензурно.
← →
Акуличев Дмитрий (2004-09-08 15:38) [449]
> Суслик © (08.09.04 15:25) [447]
Да нету там никакого _addref.
Я даже смотреть туда не буду. Нету его там, и быть не может.
← →
Суслик © (2004-09-08 15:41) [450]
> Акуличев Дмитрий (08.09.04 15:34) [448]
> А на матчасть ты зря обижаешься. Оно есть рулез, хотя и
> не всегда приятный.
Я не обижаюсь - но ты очень скор на расправу, горячий молдавский (насколько я понимаю) парень :)) И как следствие не всегда объективен :) А раздражает это, просто жуть: люди то все умные, вроде добровольно пришли знаниями делиться, а начинается тако-о-ое ...
Читать я и сам люблю, только я долго это делаю - запомнить факты проще, чем использовать эти факты в творчестве. Поэтому долго перечитываю.
Нашел system._addref?
Я когда-то заставил ее работать - код кто-то дал и сам немного дописал. Т.к. сейчас это не использую, то найти сразу не смог - если найду поделюсь. Точно помню, что она совершенно нормально работала - главное typeInfo передавай.
← →
megabyte © (2004-09-08 15:43) [451]Хоть уже много написали, скажу про нашу общагу и универ.
Как то недвано хотел узнать, а кто модер нужной мне конфы про Дельфю, т.к. задал там вопрос, но на негод олго никто не отвечал.
Парниша мне ответил: "А зачем тебе это, Раскаль/Дельфи - это ж мертвый язык..."
И вообще большинство люде не то, что презрительно смотрят, а искренне удивляются, когда говоришь, что программишь на Дельфи. :)
Для все С++ - это просто объект поколнения(ну типа все ОС написаны на С и т.д.), остальное даже не стоит рассматривать.
з.ы. М.б. таких, как я в общаге мало, но я лично никогда не перейду на С++. Конечно, в каждом языке есть свои + и -(ну в с++ получается, только 2 плюса :) ), но мне больше по душе Pascal/Delphi. Хотя и программил-то пока мало.
М.б. и существуют такие задачи, которые удобнее делать на С++, но пока не попадались... :)
← →
Суслик © (2004-09-08 15:43) [452]
> Акуличев Дмитрий (08.09.04 15:38) [449]
>
> > Суслик © (08.09.04 15:25) [447]
>
> Да нету там никакого _addref.
> Я даже смотреть туда не буду. Нету его там, и быть не может.
Да простит меня хозяин за увеличение объема, но другого пути нет :)))
Модуль system. Дельфи 6.
Кусочек из interface частиprocedure _Initialize(p: Pointer; typeInfo: Pointer);
procedure _InitializeArray(p: Pointer; typeInfo: Pointer; elemCount: Cardinal);
procedure _InitializeRecord(p: Pointer; typeInfo: Pointer);
procedure _Finalize(p: Pointer; typeInfo: Pointer);
procedure _FinalizeArray(p: Pointer; typeInfo: Pointer; elemCount: Cardinal);
procedure _FinalizeRecord(P: Pointer; typeInfo: Pointer);
procedure _AddRef;
кусочек из implementation
procedure _AddRef{ p: Pointer; typeInfo: Pointer};
asm
MOV ECX,1
JMP _AddRefArray
end;procedure _AddRefArray{ p: Pointer; typeInfo: Pointer; elemCount: Longint};
asm
PUSH EBX
PUSH ESI
PUSH EDI
TEST ECX,ECX
JZ @@exit
MOV EBX,EAX
...
end;
← →
Ломброзо © (2004-09-08 15:44) [453]> Акуличев Дмитрий (08.09.04 15:34) [448]
>А на матчасть ты зря обижаешься. Оно есть рулез,
>хотя и не всегда приятный.
>Вот только что выкинул в помойку почти готовый RTF парсер,
>потому что нашёл описание Text Object Model.
Дайте я вас расцелую!
← →
Суслик © (2004-09-08 15:45) [454]
> Дайте я вас расцелую!
может лучше сюда?
www.sex-chat.ru :)))
За что, кстати.
← →
Акуличев Дмитрий (2004-09-08 15:49) [455]
> Суслик © (08.09.04 15:41) [450]
А, блин. Меня заклинило. Подумал, что внутри _initialize найти _addref.
← →
Суслик © (2004-09-08 15:52) [456]
> Акуличев Дмитрий (08.09.04 15:49) [455]
раньше улыбаться начал
сейчас заклин признал :)))))
может и ламерить домой пойдешь? :)))))
ЗЫ. Все исключительная шутка. Говорю об этом зная твою горячность:)
---------------------------
Рад, что понимание достигнуто
Вот посмотри на addref и скажи, почему ее не вынесли в доку.
Я скажу честно, что причин не вижу, ни одной. Может твое знание дельфи поможет в этом разобраться. Выше ты вообще говоря дал ответ, который вполне меня удовелетворяет. Но может еще что накопаешь?
← →
Акуличев Дмитрий (2004-09-08 16:07) [457]
> Суслик © (08.09.04 15:52) [456]
Заглянул в system.
Честно, никакого особого сожаления, что эти процедуры не сдлали доступными не испытал. Не дали бы они никакой выгоды, разве что текста меньше писать, вместо цикла -- одну строчку.
← →
Акуличев Дмитрий (2004-09-08 16:09) [458]
> Ломброзо © (08.09.04 15:44) [453]
С чегой бы это?
← →
Суслик © (2004-09-08 16:10) [459]
> Акуличев Дмитрий (08.09.04 16:07) [457]
Честно, никакого особого сожаления, что эти процедуры не сдлали доступными не испытал
Дмитрий, это эмоции :))
А правда где-то рядом.
Мне всегда странно, когда я вижу схожие вещи в одном и том же куске кода реализованные по-разному.
----------------
Надо будет у самого борланда спросить на форуме.
← →
Акуличев Дмитрий (2004-09-08 16:18) [460]
> Суслик © (08.09.04 16:10) [459]
Кстати, а typeinfo ты где брал?
← →
Суслик © (2004-09-08 16:21) [461]
>
> Кстати, а typeinfo ты где брал?
просматривал cpu строки finiliaze
там вторым параметром.
← →
Суслик © (2004-09-08 16:23) [462]
> Акуличев Дмитрий (08.09.04 16:18) [460]
я понимаю, что это может быть неверно.
т.к. от компиляции к компиляции адрес входа в typeinfo может меняться.
Но я и не говорил, что это реально использую. Сделать можно и точка. Как на практике брать адрес typeinfo я не разбирался - наверное можно.
← →
jack128 © (2004-09-08 16:29) [463]Суслик © (08.09.04 15:43) [452]
Кусочек из interface части
Хе. А вот в пятерке это все под имплментейшен сидит..
megabyte © (08.09.04 15:43) [451]
Для все С++ - это просто объект поколнения(ну типа все ОС написаны на С и т.д.), остальное даже не стоит рассматривать
Логика - супер!!!!! Ос"и написаны на С, а поклоняемся С++
megabyte © (08.09.04 15:43) [451]
но я лично никогда не перейду на С++.
Я тоже. А вот на Шарп или Джаву - без проблем..
> Честно, никакого особого сожаления, что эти процедуры
> не сдлали доступными не испытал. Не дали бы они
> никакой выгоды, разве что текста меньше писать, вместо
> цикла -- одну строчку.
type
TStrArr = array [0..20000] of string;
var
a, b: TStrArr;
begin
... // тут заполнили массив a. теперь его нужно скопировать в b
// 1 вариант
for i := low(a) to high(a) do
b[i] := a[i]; // поэлементное копирование + поэлементный AddRef
// 2 вариант
Move(a[0], b[0], (High(a) + 1) * SizeOf(string)); // блочное копирование
for i := low(b) to high(b) do // и поэлементный AddRef
AddRef(@b[i], TypeInfo(string));
end;
Это не преимущество?
← →
Суслик © (2004-09-08 16:32) [464]
> Это не преимущество?
ну в данном случае, наверное нет - как минимум код длиннее. Кстати сомневаюсь, что второй вариант будет сильно быстрее, чем вариант 1. Думаю будет точно быстрее, если использовать специализированные функции копирвоания памяти (я такие пробовал, автора не помню - работают быстрее move).
← →
Акуличев Дмитрий (2004-09-08 16:40) [465]
> jack128 © (08.09.04 16:29) [463]
Не так всё просто. Не все типы можно скопировать просто блочным копированием.
← →
Суслик © (2004-09-08 16:42) [466]
> Акуличев Дмитрий (08.09.04 16:40) [465]
> Не так всё просто. Не все типы можно скопировать просто
> блочным копированием.
Димон, ты что-то похоже устал от нашей дискуссии.
Конечно нельзя. Но если бы был addref, то можно было бы.
Вроде об этом и говорим не первый десяток постов:))
← →
VMcL © (2004-09-08 16:45) [467]>>all
Я не понял. Шо за дела? Holy War плавно перешел в обсуждение только Delphi. Рубить offtopic!
:O)
← →
jack128 © (2004-09-08 16:47) [468]Суслик © (08.09.04 16:32) [464]
ну в данном случае, наверное нет - как минимум код длиннее
это не недостаток. Если уж потребоволся доступ к столь низкоуровневым функциям(для оптимизации), то длина и сложность кода уже не так сильно не влияют..
> что второй вариант будет сильно быстрее, чем вариант 1.
я так подумал - он может и медленнее быть..
> Но если бы был addref, то можно было бы.
а что бы это дало? Ты же сам только что показал, что в производительности приемущества нет. Или считаешь, что с другими типами это приемущество появиться? Единственное, что мне приходит на ум - массив упакованных записей.. И то не факт - нужны тесты..
← →
Игорь Шевченко © (2004-09-08 16:47) [469]jack128 © (08.09.04 16:29) [463]
С моей (лично) точки зрения, это недостаток, так как первый вариант ясен и понятен.
← →
jack128 © (2004-09-08 16:50) [470]Игорь Шевченко © (08.09.04 16:47) [469]
Насчет ясности кода я все понимаю..
← →
Суслик © (2004-09-08 16:52) [471]
> jack128 © (08.09.04 16:47) [468]
Ты обозначь свою позицияю: ты ЗА или ПРОТИВ наличия addref?
Или сомневаешься.
я как-то не понял пока...
← →
Акуличев Дмитрий (2004-09-08 16:53) [472]
> Суслик © (08.09.04 16:42) [466]
>
> Димон, ты что-то похоже устал от нашей дискуссии.
> Конечно нельзя. Но если бы был addref, то можно было бы.
Это всё равно бы получился цикл с поэлементным копированием.
Обрати внимание: код вроде jack128 © (08.09.04 16:29) [463] не является потокобезопасным.
А вот поэлементное копирование -- потокобезопасно.
Овчинка выделки не стоит.
← →
jack128 © (2004-09-08 16:55) [473]Суслик © (08.09.04 16:52) [471]
У меня нет своей позиции. Я не считаю себя компетентным в этом вопросе.
← →
Romkin © (2004-09-08 16:57) [474]Замучили флеймить :))
Если функция не документирована - нафиг ее пользовать?
Не документирована - значит, не нужна либо может измениться в будущих версиях. Здесь - вопрос совместимости, не более того :))
← →
Суслик © (2004-09-08 16:59) [475]
> Акуличев Дмитрий (08.09.04 16:53) [472]
> Это всё равно бы получился цикл с поэлементным копированием.
ну так е-мое, конечно.
кто спорит.
> Обрати внимание: код вроде jack128 © (08.09.04 16:29)
> [463] не является потокобезопасным.
> А вот поэлементное копирование -- потокобезопасно.
вах! Доказать можешь?
Ты уверен, что для строк это будет так
т.е. ты уверен, что тело LStrAsg разработано как потоко безопасное?
ЗЫ. Я не спорю - я хочу понять откуда такая уверенность.
← →
Суслик © (2004-09-08 17:01) [476]
> Romkin © (08.09.04 16:57) [474]
Флеймить?
Мы что-то нарушаем? :))))
Я тебя куда-нить послал или Акуличева?
Не нравится, не смотри.
← →
Суслик © (2004-09-08 17:05) [477]
> Акуличев Дмитрий (08.09.04 16:53) [472]
По поводу потокобезопасности копирования строк.
Может ты и прав - вообще все сделано через interloced increment.
Ты до этого сам дошел или явно прочел где-нить?
← →
Акуличев Дмитрий (2004-09-08 17:08) [478]
> вах! Доказать можешь?
> Ты уверен, что для строк это будет так
> т.е. ты уверен, что тело LStrAsg разработано как потоко
> безопасное?
Не был бы уверен -- не говорил бы.
За доказательствами -- в system.pas
← →
Акуличев Дмитрий (2004-09-08 17:11) [479]
> Ты до этого сам дошел или явно прочел где-нить?
И то, и другое.
← →
Суслик © (2004-09-08 17:12) [480]
> Акуличев Дмитрий (08.09.04 17:08) [478]
ну в общем-то я уже с тобой выше почти согласился.
почти, т.к.надо еще посмотреть.
Страницы: 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
Память: 1.59 MB
Время: 0.168 c