![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как может оптимизатор пропускать такое?
TUser © (2004-12-23 12:50:00)Я очень удивлен - ведь очевидно, как это оптимизировать.
procedure DoSomething(Data: string);
begin
здесь как-нибудь используем string(PAnsiChar(Data)) ...
end;
В откомпилированном коде видим вызовы LStringToChar и LStringFromChar.
Почему так? Я понимаю, что имея скомпилитрованный код трудно понять, как его модифицировать. Но, когда еще идет только работа с исходником, то легко ведь можно увидеть, что приведение типов - дурацкое.
pasha_golub (2004-12-24 14:19:00) [1]icWasya © (24.12.04 11:25) [8]
ИМХО, 'abcd'
Anatoly Podgoretsky (2004-12-24 11:59:00) [2]TUser © (24.12.04 10:13) [3]
Необязательно.
Первое преобразование будет использовать символы до первого нуля. Возможно в этом и цель данного преоразоаватния. Второе внешнее преобразование наверно лишнее, для перестраховки.
TUser (2004-12-24 11:53:00) [3]
> Digitman
Спасибо
> icWasya
Да, это соображение тоже правильно. Спасибо.
icWasya (2004-12-24 11:25:00) [4]а кстати, что будет выведено на экран такой программой ??
var
Data,S:String;
begin
Data:='abcd'#0'xyz';
S:=string(PAnsiChar(Data));
ShowMessage(S);
end;
Digitman (2004-12-24 11:18:00) [5]а то что упомянутое в данном виде "приведение типов" дурацкое - это не вызывает сомнения
достаточно просто написать s := Data, и здесь компилятор сгенерирует вполне оптимальный код, инкрементирующий ссылку на буфер строки в дин.стуктуре Data
но как только после
s := Data
ты напишешь, например,
s := 'XXX',
компилятор сгенерирует код, декрементирующий вышеупомянутую ссылку, и далее же - код, аналогичный по действию того самого "дурацкого приведения типа"
Digitman (2004-12-24 11:13:00) [6]
> TUser © (24.12.04 10:47) [5]
оператор string(), который ты подразумеваешь под "приведением типа", на самом деле делает копию исходной строки - аллокирует память под дин.упр.структуру новой строки и буфер, копирует содержимое буфера источника в буфер приемника, после чего возвращает указатель на эту вновь созданную дин.структуру
этот указатель ты записываешь в переменную s и далее "работаешь" с этой переменной (if s = Data then ..)
а раз "работаешь", то оптимизатор не вправе устранять якобы "избыточный" код по созданию "копии" - с момента "if" код этот уже отнюдь не избыточен
TUser (2004-12-24 10:47:00) [7]Равны содержимые строковых буферов. Т.е. если я напишу
s:=string(PAnsiChar(Data));
if s = Data then ...
то результат будет true - строки равны.
Digitman (2004-12-24 10:41:00) [8]
> Т.е. результат всегда будет равен исходной строке
ну что значит "равен" ?
"равен" можно понимать двояко : равны содержимые строковых буферов и равны указатели на строковый буфер
TUser (2004-12-24 10:13:00) [9]
> чем же тебе не понравились рез-ты работы оптимизатора ?
> поясни ..
Ну я же написал явную глупость - приведение типов, потом обратное приведение. Т.е. результат всегда будет равен исходной строке. Такое преобразование надо убирать во время оптимизации. Или я не прав?
Palladin (2004-12-24 04:09:00) [10]Если только используем то, однако:
procedure DoSomething( Const Data: string);
begin
здесь как-нибудь используем string(PAnsiChar(Data)) ...
end;
Digitman (2004-12-23 12:58:00) [11]чем же тебе не понравились рез-ты работы оптимизатора ? поясни ..