Всем привет, и заранее спасибо за ответ. У меня есть вопрос, на который бы очень хотелось получить ответ)). Может кто знает и объяснит? К примеру имеем вот такую процедуру (Delphi, соответственно)-): //**начало******************************************* procedure TForm1.FormCreate(Sender: TObject); const con='first and single constant'; var c:string; begin c:='My string'; end; //**конец******************************************* 1.Компилируем. 2.Исполняемый файл загуржаем в Olly 3. Ctrl+A (у кого анализ не задан при загрузке) 4. Search for > All referenced string по адресу 0044CD5E видим следующую строчку: MOV EDX,Project1.0044CD90 Text string=ASCII "My string" Это наша переменная. Но где константа? Почему её нет? (кстати её нет только до тех пор пока мы не будем её использовать в теле процедуры). При этом вот что интересно пишем такую процедуру: //**начало******************************************* procedure TForm1.FormCreate(Sender: TObject); const con='first and single constant'; var i:integer; c:string; begin i:=1; if i=1 then c:='My string'+'prefix' else c:=con+'prefix'; // эта строка никогда не будет выполнена end; //**конец******************************************* Снова идем в Olly: 0044CD66 MOV EDX,Project1.0044CDA8 ASCII "My string prefix" 0044CD75 MOV EDX,Project1.0044CDC0 ASCII "first and single constant prefix" В связи с этим сам вопрос (из ста пятидесяти пунктов-)): хе-хе. а) Почему если константа не используется в процедуре то и в исполняемом файле этой константы нет? Она отсекается ещё на этапе компиляции? В то время как простые переменные (используются ли они или нет) будут находится в дампе. б) Почему во втором примере компилятор все ре резервирует тот самый вариант который никогда не будет выполнен? г) Есть ли какая литература по описанию этих принципов (желательно все о типах и их "предоставлении" в дампе, можно и на english) - либо такой литературы в обобщенном виде нет? и все дело именно в копиляции и самом копиляторе? д) Тот кто изучал детально описание PE - может там что сказанно по этому поводу? Ого, сколько настрочил.... Заранее сп. и всем удачи.
hopi_indian Потому что у константы нет типа. Компилятор не знает, в каком из возможных строковых типов её хранить. Если написать Код (Text): con:AnsiString='first and single constant'; , константа будет. Потому что до компилятора дошло, что это может быть ANSI-строка, но никак не WideString или UnicodeString. Именно в них. Delphi давно уже сам себе стандарт и работает в согласии с одной лишь волей Borland/Codegear/Embarcadero.