Форум: "Начинающим";
Текущий архив: 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.043 c