![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Pos и дин. массив
Kent25791 © (2006-10-30 20:50:00)Всем привет. Может ли функция pos искать строку в ДИНАМИЧЕСКОМ массиве? если да как это сделать?
Kent25791 (2006-10-31 15:04:00) [1]В последнем я говорю про pos(string) . См [16]
Kent25791 (2006-10-31 15:02:00) [2]>> Копирования там не происходит, как уже было показано...
Где было показано ??
Было показано что если сделать так string (дин. массив), тогда не происходит копирования. но см. [32].
И второе, совсем незавимимое от первого:
call @LStrPos >> Пусть входная - string .
Войдите в Pos трассировщиком и убедитесь.
Вот про это я говорил.
@!!ex (2006-10-31 07:48:00) [3]
> А также про случай с pos, в котором string , там где требуется
> быстродействие, лучше не применять.
Почему?
Копирования там не происходит, как уже было показано...
Kent25791 (2006-10-31 01:26:00) [4]>> кроме регистровой передачи двух параметров в функцию LStrPos ничего не происходит.
Я говорил про большинство:
Pchar, char, WideChar, ShortString, статический массив...
А также про случай с pos, в котором string , там где требуется быстродействие, лучше не применять.
Джо (2006-10-31 01:06:00) [5]> [10] Джо © (30.10.06 22:13)
> Это НЕ конвертирование. Это преобразование типа.
Тьфу, только сейчас заметил свою опечатку. Имелось в виду "приведение", конечно.
Джо (2006-10-31 00:06:00) [6]> [29] Leonid Troyanovsky © (31.10.06 00:02)
>
> > Джо © (30.10.06 23:59) [27]
>
> > А что на него глядеть? Там что-то другое будет?
>
>
> Тогда про оптимизацию - лишнее, IMHO.
Да, тут я маху дал.
Leonid Troyanovsky (2006-10-31 00:02:00) [7]
> Джо © (30.10.06 23:59) [27]
> А что на него глядеть? Там что-то другое будет?
Тогда про оптимизацию - лишнее, IMHO.
--
Regards, LVT.
Leonid Troyanovsky (2006-10-31 00:01:00) [8]
> Джо © (30.10.06 23:47) [25]
> А это уже меня не касается, мое дело было в точности на
> поставленный вопрос ответить :)
Зачот :)
--
Regards, LVT.
Джо (2006-10-30 23:59:00) [9]А что на него глядеть? Там что-то другое будет?
Leonid Troyanovsky (2006-10-30 23:54:00) [10]
> Джо © (30.10.06 23:46) [24]
> листингом приведенного кода (с отключенной оптимизацией):
Дык, надо б было и с включенной, для полноты, так сказать.
Ну, и только для полноты ради, еще и StrPos ($O+/-)
--
Regards, LVT.
Джо (2006-10-30 23:47:00) [11]> [23] Leonid Troyanovsky © (30.10.06 23:39)
> А то совсем распустились, понимаешь.
А это уже меня не касается, мое дело было в точности на поставленный вопрос ответить :)
Джо (2006-10-30 23:46:00) [12]Всем любителям поспорить предлагаю ознакомиться с ассемблерным листингом приведенного кода (с отключенной оптимизацией):
var
A : array of Char;
begin
Pos ('abc',string(A))
end;
---
mov edx,[ebp-$04]
mov eax,some_addr
call @LStrPos
Всякий спорщик сможет убедиться, что кроме регистровой передачи двух параметров в функцию LStrPos ничего не происходит.
Leonid Troyanovsky (2006-10-30 23:39:00) [13]
> Джо © (30.10.06 23:19) [20]
> p : array [0..255] of Char;
> Уберите выделенное.
Не уберу.
Все знают, что динамический массив Char - это String,
начинающийся с 1.
Уж если совсем невтерпеж - пусть пользуют StrPos,
как советует АП.
А то совсем распустились, понимаешь.
--
Regards, LVT.
Kent25791 (2006-10-30 23:34:00) [14]>> То есть операция string(A) приведет к копированию данных по вашему? :))
А вы и не знали?
PVOzerski (2006-10-30 23:24:00) [15]Сейчас под руками нет Delphi. На FPC сработало вот такое:
var
s: array of char;
begin
s := '123ABCD890';
writeln(pos('ABC', PChar(@s[0])));
end.
Но вот что будет, если s = nil? С FPC всё нормально, в Delphi может отличаться реализация Pos.
Джо (2006-10-30 23:19:00) [16]> [19] Leonid Troyanovsky © (30.10.06 23:00)
p : array [0..255]of Char;
Уберите выделенное.
Leonid Troyanovsky (2006-10-30 23:00:00) [17]
> Джо © (30.10.06 22:33) [14]
> Что "наоборот"?
procedure TForm1.Button1Click(Sender: TObject);
var
p : array [0..255] of Char;
begin
StrCopy(p, '0123456789');
Caption := Format('%x <> %p', [Longint(@p[0]), Pointer(String(p))]);
end;
--
Regards, LVT.
@!!ex (2006-10-30 22:58:00) [18]
> Kent25791 (30.10.06 22:42) [16]
То есть операция string(A) приведет к копированию данных по вашему? :))
Anatoly Podgoretsky (2006-10-30 22:43:00) [19]string(A) это конечно трюк, основанный на некотором подобии структур, а вот StrPos уже не трюк.
Kent25791 (2006-10-30 22:42:00) [20]>> очень быстрая операция.....
Вы в этом уверены? В свое время я на это потратил достаточно времени .Смотрите что будет в данном случае:
Массив - от 4096 - до 1073741824 байт.
преобразование в string :
Компилятор выделяет память из кучи и копирует все туда (раз)
Дальше самое интересное,:
в функиции pos при использовании строки добавляется скрытый блок try finally.
Сразу предвижу вопросы, сразу объясню:
Так как компилятор будет считать что значение возможно будет изменяться , поэтому вводит скрытую локальную переменную для хранения строки (два).
Вначале выполнения функции счетчик ссылок будет увеличен на 1, в конце уменьшен на 1. Чтобы гарантировать что значение счетчика всегда будет уменьшаться компилятор и втсавляет этот скрытый блок try finally.(три)
Все вместе взятое снизит быстродействие в несколько раз.
Думал вы знаете о чем я говорил. как оказалось не все...