Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.03;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.072 c
15-1163311268
Сало
2006-11-12 09:01
2006.12.03
Кличко! Кличко!


4-1153425976
Батыр
2006-07-21 00:06
2006.12.03
Как узнать цвет заданной точки экранна


4-1153829366
sVic
2006-07-25 16:09
2006.12.03
Как определить владельца файла(NTFS)


4-1153296669
Интересующийся
2006-07-19 12:11
2006.12.03
Два вопроса о региональных стандартах


2-1163669091
Tor
2006-11-16 12:24
2006.12.03
Перевод значения Variant в Extended если значение равно Null