Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1103811959
Adoon
2004-12-23 17:25
2005.01.09
Как определить версию Excel (97 или 2000) и язык


4-1101194549
Kurtevich
2004-11-23 10:22
2005.01.09
Как поменять шрифт окна?


1-1103622567
Vyacheslav
2004-12-21 12:49
2005.01.09
Проблема создания excel документа...


14-1103616384
Vasya.ru
2004-12-21 11:06
2005.01.09
regedit не запускается


4-1101128855
Новик
2004-11-22 16:07
2005.01.09
Выделить часть текста в чужом окне





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский