Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


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]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо