Чисто теоретический вопрос

Тема в разделе "WASM.BEGINNERS", создана пользователем hopi_indian, 27 мар 2011.

  1. hopi_indian

    hopi_indian New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2011
    Сообщения:
    4
    Всем привет, и заранее спасибо за ответ.
    У меня есть вопрос, на который бы очень хотелось получить ответ)). Может кто знает и объяснит?

    К примеру имеем вот такую процедуру (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 - может там что сказанно по этому поводу?

    Ого, сколько настрочил.... Заранее сп. и всем удачи.
     
  2. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    hopi_indian
    Потому что у константы нет типа. Компилятор не знает, в каком из возможных строковых типов её хранить. Если написать
    Код (Text):
    1. con:AnsiString='first and single constant';
    , константа будет.

    Потому что до компилятора дошло, что это может быть ANSI-строка, но никак не WideString или UnicodeString.

    Именно в них. Delphi давно уже сам себе стандарт и работает в согласии с одной лишь волей Borland/Codegear/Embarcadero.
     
  3. hopi_indian

    hopi_indian New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2011
    Сообщения:
    4
    CyberManiac - recpect! Лучшего объяснения я и не ждал. Всем сп.
     
  4. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Это называется Оптимизация