Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.09;
Скачать: CL | DM;

Вниз

Как может оптимизатор пропускать такое?   Найти похожие ветки 

 
TUser ©   (2004-12-23 12:50) [0]

Я очень удивлен - ведь очевидно, как это оптимизировать.

procedure DoSomething(Data: string);
begin
 здесь как-нибудь используем string(PAnsiChar(Data)) ...
end;

В откомпилированном коде видим вызовы LStringToChar и LStringFromChar.

Почему так? Я понимаю, что имея скомпилитрованный код трудно понять, как его модифицировать. Но, когда еще идет только работа с исходником, то легко ведь можно увидеть, что приведение типов - дурацкое.


 
Digitman ©   (2004-12-23 12:58) [1]

чем же тебе не понравились рез-ты работы оптимизатора ? поясни ..


 
Palladin ©   (2004-12-24 04:09) [2]

Если только используем то, однако:
procedure DoSomething(Const Data: string);
begin
здесь как-нибудь используем string(PAnsiChar(Data)) ...
end;


 
TUser ©   (2004-12-24 10:13) [3]


> чем же тебе не понравились рез-ты работы оптимизатора ?
> поясни ..

Ну я же написал явную глупость - приведение типов, потом обратное приведение. Т.е. результат всегда будет равен исходной строке. Такое преобразование надо убирать во время оптимизации. Или я не прав?


 
Digitman ©   (2004-12-24 10:41) [4]


> Т.е. результат всегда будет равен исходной строке


ну что значит "равен" ?
"равен" можно понимать двояко : равны содержимые строковых буферов и равны указатели на строковый буфер


 
TUser ©   (2004-12-24 10:47) [5]

Равны содержимые строковых буферов. Т.е. если я напишу
s:=string(PAnsiChar(Data));
if s = Data then ...
то результат будет true - строки равны.


 
Digitman ©   (2004-12-24 11:13) [6]


> TUser ©   (24.12.04 10:47) [5]


оператор string(), который ты подразумеваешь под "приведением типа", на самом деле делает копию исходной строки - аллокирует память под дин.упр.структуру новой строки и буфер, копирует содержимое буфера источника в буфер приемника, после чего возвращает указатель на эту вновь созданную дин.структуру

этот указатель ты записываешь в переменную s и далее "работаешь" с этой переменной (if s = Data then ..)

а раз "работаешь", то оптимизатор не вправе устранять якобы "избыточный" код по созданию "копии" - с момента  "if" код этот уже отнюдь не избыточен


 
Digitman ©   (2004-12-24 11:18) [7]

а то что упомянутое в данном виде "приведение типов" дурацкое - это не вызывает сомнения

достаточно просто написать s := Data, и здесь компилятор сгенерирует вполне оптимальный код, инкрементирующий ссылку на буфер строки в дин.стуктуре Data

но как только после
s := Data
ты напишешь, например,
s := "XXX",
компилятор сгенерирует код, декрементирующий вышеупомянутую ссылку, и далее же - код, аналогичный по действию того самого "дурацкого приведения типа"


 
icWasya ©   (2004-12-24 11:25) [8]

а кстати, что будет выведено на экран такой программой ??

var
 Data,S:String;
begin

Data:="abcd"#0"xyz";
S:=string(PAnsiChar(Data));
ShowMessage(S);
end;


 
TUser ©   (2004-12-24 11:53) [9]


> Digitman

Спасибо

> icWasya

Да, это соображение тоже правильно. Спасибо.


 
Anatoly Podgoretsky ©   (2004-12-24 11:59) [10]

TUser ©   (24.12.04 10:13) [3]
Необязательно.
Первое преобразование будет использовать символы до первого нуля. Возможно в этом и цель данного преоразоаватния. Второе внешнее преобразование наверно лишнее, для перестраховки.


 
pasha_golub ©   (2004-12-24 14:19) [11]

icWasya ©   (24.12.04 11:25) [8]
ИМХО, "abcd"



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

Текущий архив: 2005.01.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.047 c
4-1100862515
andrey__
2004-11-19 14:08
2005.01.09
NamedPipe


1-1103490857
VaDima
2004-12-20 00:14
2005.01.09
Установка свойства Parent для TWebBrowser - нарушение работы


4-1100790422
integer
2004-11-18 18:07
2005.01.09
Подскажите как найти в какой *.dll сидят свойства притера


14-1103395533
Nic87
2004-12-18 21:45
2005.01.09
Сайт вырос


1-1103789211
syte_ser78
2004-12-23 11:06
2005.01.09
как обьявить переменную?