Форум: "Основная";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
ВнизКак может оптимизатор пропускать такое? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c