Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];

Вниз

inline   Найти похожие ветки 

 
qui_   (2006-11-17 11:22) [0]

Здраствуйте. Често говоря совесем не понял, что такое inline; касательно delphi7 и ниже, в 2005 я так понял изменили смысл inline и вовсе. Но что делает inline в delphi7?

Я предпологал, что такой код на деле будет вставляться, а не вызываться.

procedure Msg;
begin
 MessageBoxA(...
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Msg;
end;

Т.е. в таком случае этот код будет выглядеть как-то так:
...
call Msg


А с инлайном procedure Msg; inline;
будет что, сразу эта процедура врезается в код, заместо call будет сразу вызов:
...
push 0
..
call MessageBoxA

Но так ли это? Попытки использовать inline в d7, приводят к Declaration Expected but INLINE found.

Вопрос что делает inline в дельфи 7 и ниже и что делает инлайн в 2005 и выше? И что такое "Declaration Expected but INLINE found."?

Спасибо.


 
clickmaker ©   (2006-11-17 11:40) [1]

inline - это в смысле inline-asm


 
guav ©   (2006-11-17 14:18) [2]

inline в старом паскале позволяла вставлять непосредственно машинные коды (как в DB в asm).
в D7 inline вроде никак вообще не используется.


 
Anatoly Podgoretsky ©   (2006-11-17 14:30) [3]

> guav  (17.11.2006 14:18:02)  [2]

Смотрел я на реализацию, куча Push, а потом Pop
Ну ее нафиг такой INLINE


 
guav ©   (2006-11-17 14:38) [4]

> [3] Anatoly Podgoretsky ©   (17.11.06 14:30)


это не мне, я не пользуюсь в Д7 им.
он, кстати, отладке сильно мешает ?


> Смотрел я на реализацию, куча Push, а потом Pop

А он наверное сначала компилирует, а потом подставляет, это ж не макрос.


 
Anatoly Podgoretsky ©   (2006-11-17 14:50) [5]

> guav  (17.11.2006 14:38:04)  [4]

В ДХ его уже не было, не помню только про Д1


 
Anatoly Podgoretsky ©   (2006-11-17 14:51) [6]

> guav  (17.11.2006 14:38:04)  [4]

Отладке не очень, поскольку для большинства ассемлер это какая то китайская грамота, но ведь в окне отладчика, по крайней мере указывается исходная строка.


 
guav ©   (2006-11-17 15:00) [7]

> [6] Anatoly Podgoretsky ©   (17.11.06 14:51)

Я про отладку без CPU. Обычно хватает трассировки watch, call stack.
Не начинают же отладку с использования окна CPU и отладки asm-кода RTL :-)

Вот если нажать на вызофе инлайн Ф7, войдёт ли трассировка в инлайн и заработают ли watch и call stack ?


> для большинства ассемлер это какая то китайская грамота

Разве ?


 
Джо ©   (2006-11-17 15:38) [8]

> [3] Anatoly Podgoretsky ©   (17.11.06 14:30)
> Смотрел я на реализацию, куча Push, а потом Pop
> Ну ее нафиг такой INLINE

Анатолий, Вы ошибаетесь. Ни в какие push/pop не транслируется. Транслируется в операции с РОН и косвенное обращение к esp+xx. Вот простой пример в доказательство моих слов.

procedure Proc (A,B,C,D,E,F,G,H,I,J: Integer); inline;
begin
 ShowMessageFmt ("%d",[A+B+C+D+E+F+G+H])
end;

procedure TForm25.Button1Click(Sender: TObject);
var
 A,B,C,D,E,F,G,H,I,J: Integer;
begin
 A := 10;
 B := 20;
 C := 30;
 D := 40;
 E := 50;
 F := 60;
 G := 70;
 H := 80;
 I := 90;
 J := 100;
 Proc (A,B,C,D,E,F,G,H,I,J)
end;

====

Unit25.pas.45: Proc (A,B,C,D,E,F,G,H,I,J)
00457F9F 03D0             add edx,eax
00457FA1 03CA             add ecx,edx
00457FA3 03F1             add esi,ecx
00457FA5 03FE             add edi,esi
00457FA7 03EF             add ebp,edi
00457FA9 032C24           add ebp,[esp]
00457FAC 036C2404         add ebp,[esp+$04]
00457FB0 896C2408         mov [esp+$08],ebp
00457FB4 C644240C00       mov byte ptr [esp+$0c],$00
00457FB9 8D442408         lea eax,[esp+$08]
00457FBD 8BD0             mov edx,eax
00457FBF B8DC7F4500       mov eax,$00457fdc
00457FC4 33C9             xor ecx,ecx
00457FC6 E8B143FDFF       call ShowMessageFmt


Так что реализация вполне приличная :)


 
Anatoly Podgoretsky ©   (2006-11-17 15:41) [9]

> guav  (17.11.2006 15:00:07)  [7]

Ой не задавай таких сложных вопросов, я уже сколько лет не видел этот INLINE, что я могу сказать конкретного.


 
Anatoly Podgoretsky ©   (2006-11-17 15:42) [10]

> Джо  (17.11.2006 15:38:08)  [8]

Ты про что, мы говорили про старые версии, а там никаких register calling convention не было. Что творится сейчас совсем другое дело.


 
Джо ©   (2006-11-17 15:45) [11]

> [10] Anatoly Podgoretsky ©   (17.11.06 15:42)
> > Джо  (17.11.2006 15:38:08)  [8]
>
> Ты про что, мы говорили про старые версии, а там никаких
> register calling convention не было. Что творится сейчас
> совсем другое дело.

А, я думал Вы о реинкарнированном inline :)


 
guav ©   (2006-11-17 15:45) [12]

> [10] Anatoly Podgoretsky ©   (17.11.06 15:42)


> Ты про что, мы говорили про старые версии

нет я как раз говорил про современный инлайн.

старый инлайн имеент вообще лругое значение, это всё что я про него сказал:

> inline в старом паскале позволяла вставлять непосредственно
> машинные коды (как в DB в asm).


 
Anatoly Podgoretsky ©   (2006-11-17 15:47) [13]

> Джо  (17.11.2006 15:45:11)  [11]

Трудно сказать с одной стороны хорошо, с другой стороны, что бы получить заметный выигрыш, этот inline должен быть в крупном блоке. Поскольку разница только в двух командах Call/Ret
которая нивелируется современным процессорами


 
Anatoly Podgoretsky ©   (2006-11-17 15:49) [14]

> guav  (17.11.2006 15:45:12)  [12]

> старый инлайн

Их было два - ASM INLINE - это самый старый и Function Inline
Я говорил про второе, мне он не понравился, много лишнего кода, чтобы его можно было называть Inline


 
Джо ©   (2006-11-17 15:51) [15]

>
> [14] Anatoly Podgoretsky ©   (17.11.06 15:49)
> > guav  (17.11.2006 15:45:12)  [12]
> Их было два - ASM INLINE - это самый старый и Function Inline

А разве function inline было в старых версиях? Что-то я не вспомню такого.


 
Джо ©   (2006-11-17 15:52) [16]

> [13] Anatoly Podgoretsky ©   (17.11.06 15:47)
> > Джо  (17.11.2006 15:45:11)  [11]
>
> Трудно сказать с одной стороны хорошо, с другой стороны,
> что бы получить заметный выигрыш, этот inline должен быть
> в крупном блоке. Поскольку разница только в двух командах
> Call/Ret

Да нет же, разница как-раз в тех самых push/pop. Если, конечно, все параметры не влазят в РОН :)


 
Anatoly Podgoretsky ©   (2006-11-17 15:56) [17]

> Джо  (17.11.2006 15:51:15)  [15]

Не помню точно в какой версии, но было, об этом даже есть смутное упоминание в справке.
А помню, потому что смотрел сгенерированый код в отладчике - незабываемое впечатление.


 
Anatoly Podgoretsky ©   (2006-11-17 15:58) [18]

> Джо  (17.11.2006 15:52:16)  [16]

Код выглядел так

Push N
...
pop reg
push localN
...
тело функции, с обращение к стеку за переменными
Pop
...



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.046 c
2-1163595026
Новечек
2006-11-15 15:50
2006.12.03
Как подсчитать дробные числа?


15-1163495507
iZEN
2006-11-14 12:11
2006.12.03
Sun выпустила Java по лицензии GPL v.2


15-1163416926
wezzz
2006-11-13 14:22
2006.12.03
Определить без тестера 0 или заземление?


2-1163530310
Vasiliy
2006-11-14 21:51
2006.12.03
Перекрыл GetClientRect, отрисовывается не весь компонент


8-1145908539
Jrek
2006-04-24 23:55
2006.12.03
Соунд карточки





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский