Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > __fastcall


Автор: Dmi3ev 5.5.2009, 15:36
__fastcall
Порылся в гугле, но так и не понял, когда его применять?
Если у меня функция без параметров, то совсем не надо?
Я понял, что там завязка в том, что используются регистры для передачи параметров, а сколько их в Билдере я даже не знаю  smile Остальное через стек передается... Замут какой-то такой, примерно  smile Я так понял...
У меня функции мои без параметров совсем, подскажите, нужно ли вообще это дело???
И немного поясните, если можно, попроще...

Автор: Alexeis 5.5.2009, 15:40
  Можно использовать везде, кроме Dll, там желательно использовать stdcall. Разницы большой не будет, поскольку регистры то все равно нужны, поэтому в больших функциях параметры из регистров сбрасываются в стек, чтобы освободить необходимые для работы регистры. В маленьких функциях может дать прирост, хотя по правде говоря маленькие функции лучше инлайнить, чтобы совсем избавиться от вызова функции.

Автор: Dmi3ev 5.5.2009, 15:56
Цитата

маленькие функции лучше инлайнить, чтобы совсем избавиться от вызова функции. 

те, если у меня функция допустим:
Код

bool TForm2::MyCheck1()
{
return(Edit1->Text!="" && Edit2->Text!=0 && Edit3->Text!="" && Edit4->Text!=0 &&
       Edit5->Text!="" && Edit6->Text!=0 && MaskEdit1->Text!="");
}

то ее лучше как inline объявить??? Так??? и никаких фастколов не нужно...

Автор: Alexeis 5.5.2009, 16:17
  Запросто. Работать будет быстрее.

Автор: Dmi3ev 5.5.2009, 16:19
Я своим колхозным языком скажу так:
1) если функция маленькая, те несколько строк, ее лучше инлайнить
2) в остальных случаях писать фастколл, и не париться... комп сам сообразит, что да как...
Правильно?  smile 

Автор: Alexeis 5.5.2009, 16:36
Цитата(Dmi3ev @  5.5.2009,  15:19 Найти цитируемый пост)
1) если функция маленькая, те несколько строк, ее лучше инлайнить

  Лучше сказать так, если функция выполняется за время сопоставимое со временем ее вызова, то лучше инлайнить.

Цитата(Dmi3ev @  5.5.2009,  15:19 Найти цитируемый пост)
2) в остальных случаях писать фастколл, и не париться... комп сам сообразит, что да как...

  Вообще, не всегда. Если используются плагины или проект сам является плагином или библиотекой (статической или динамической), то соглашение о вызове имеет значение. В С++ i386 принято использовать cdecl, WinApi stdcall, для COM там вроде safecall, для VCL fastcall. Лучше использовать то что принято, меньше шансов встреть лишние проблемы и вопросы.

Автор: Dmi3ev 5.5.2009, 17:25
Цитата

сам является плагином или библиотекой (статической или динамической)

про это сейчас речь не веду...
Цитата

Лучше сказать так, если функция выполняется за время сопоставимое со временем ее вызова, то лучше инлайнить.

ок

Автор: artsb 5.5.2009, 22:32
Цитата(Dmi3ev @  5.5.2009,  16:19 Найти цитируемый пост)
1) если функция маленькая, те несколько строк, ее лучше инлайнить

На самом деле, если даже вы объявите функцию как inline это ещё не гарантирует того, что она будет inline. Здесь на усмотрение компилятора. Т.е. если он решит что её можно сделать inline, то он сделает, иначе, это будет обычная функция.

Автор: Kirgston 5.5.2009, 22:43
А вообще полагаясь на мой учебник... фаст калл короче... при его применении компилятор старается занести переменные в регистры процессора и тем самым увеличить скорость выполнения

Автор: Alexeis 5.5.2009, 23:21
Цитата(Kirgston @  5.5.2009,  21:43 Найти цитируемый пост)
фаст калл короче... при его применении компилятор старается занести переменные в регистры процессора и тем самым увеличить скорость выполнения 

  Я ж не отрицаю, что для маленьких функций это может работать. Попробуйте посмотреть асмовский код большой функции, все равно эти регистры сбрасывают в стек, так что прироста по сравнению с cdecl не добьетесь.

Автор: dumb 6.5.2009, 07:40
Цитата(Alexeis @  5.5.2009,  16:17 Найти цитируемый пост)
Запросто. Работать будет быстрее. 
не будет. для начала, компилер это не заинлайнит. а вообще, советую глянуть код одного сравнения из выше-приведенных:
Код

Unit1.cpp.35: bool rt = Edit1->Text!="";
00401A40 66C745D81400     mov word ptr [ebp-0x28],0x0014
00401A46 8D45FC           lea eax,[ebp-0x04]
00401A49 E8AAFFFFFF       call System::AnsiString::AnsiString()
00401A4E 8BD0             mov edx,eax
00401A50 FF45E4           inc dword ptr [ebp-0x1c]
00401A53 8B4DC4           mov ecx,[ebp-0x3c]
00401A56 8B81F4020000     mov eax,[ecx+0x000002f4]
00401A5C E813AD0200       call Controls::TControl::GetText(Controls::TControl * const )
00401A61 8D55FC           lea edx,[ebp-0x04]
00401A64 52               push edx
00401A65 BA88914600       mov edx,0x00469188
00401A6A 8D45F8           lea eax,[ebp-0x08]
00401A6D E85A5F0600       call System::AnsiString::AnsiString(System::AnsiString * const ,const char *)
00401A72 FF45E4           inc dword ptr [ebp-0x1c]
00401A75 8D55F8           lea edx,[ebp-0x08]
00401A78 58               pop eax
00401A79 E84A600600       call System::AnsiString::operator !=()
00401A7E 8845C3           mov [ebp-0x3d],al
00401A81 FF4DE4           dec dword ptr [ebp-0x1c]
00401A84 8D45F8           lea eax,[ebp-0x08]
00401A87 BA02000000       mov edx,0x00000002
00401A8C E8F35F0600       call System::AnsiString::~AnsiString(System::AnsiString * const ,int)
00401A91 FF4DE4           dec dword ptr [ebp-0x1c]
00401A94 8D45FC           lea eax,[ebp-0x04]
00401A97 BA02000000       mov edx,0x00000002
00401A9C E8E35F0600       call System::AnsiString::~AnsiString(System::AnsiString * const ,int)
00401AA1 66C745D80800     mov word ptr [ebp-0x28],0x0008


если уж оптимизировать(про корень зла слышали? smile), то сравнения EditX->Text!="" лучше заменить на EditX->GetTextLen(). а вообще, глупости это все.

Dmi3ev, даже когда у метода нет параметров, один неявный(this) таки передается.

Автор: Alexeis 6.5.2009, 09:14
dumb, получается что функция в асм коде большая, кроме того в ней вызовы функций. Разумно.

Автор: Dmi3ev 6.5.2009, 10:59
Цитата

а вообще, глупости это все.

В смысле? Что именно глупость?
Я просто создал свою функцию, которая че-то делает... 
Потом смотрю везде фастколлы стоят, начал рыть инфу, примерно понял, но решил спросить, что да как... 
Тут зашла речь про инлайн...
А теперь я уж и не знаю, что мне писать и как  smile 
Цитата

Dmi3ev, даже когда у метода нет параметров, один неявный(this) таки передается.

хм, это намек а то, что ставить фастколл нужно?
ЗЫ
dumb, загадками говоришь, а загадки связанные с программированием не мой конек...  smile 

Автор: dumb 6.5.2009, 12:11
Цитата(Alexeis @  6.5.2009,  09:14 Найти цитируемый пост)
получается что функция в асм коде большая
большая - слово весьма мягкое для такого функционала, но за все приходится платить: выше уровень(удобство) - жирнее код.
Цитата(Alexeis @  6.5.2009,  09:14 Найти цитируемый пост)
кроме того в ней вызовы функций
причем далеко не единичного уровня "вложенности".

Цитата(Dmi3ev @  6.5.2009,  10:59 Найти цитируемый пост)
В смысле? Что именно глупость?
ну ты как-то вырвал из контекста - глупостью я обозвал предложенную мной замену, ибо оптимизация в данном случае(builder,vcl,etc) нужна другого рода. впрочем, и пытаться экономить на соглашениях вызова/инлайнах - тоже занятие то еще...

Цитата(Dmi3ev @  6.5.2009,  10:59 Найти цитируемый пост)
хм, это намек а то, что ставить фастколл нужно?
необходимости в этом нету, разве что для поддержания общего стиля, задаваемого борландом. ну или при экспорте/импорте нужно соблюдать(вроде уже упоминали здесь).

ps: Dmi3ev, что это ты в последнее время так усердно начал открещиваться от программинга? - повышение получил что ли? smile

Автор: Dmi3ev 6.5.2009, 15:03
Цитата

Dmi3ev, что это ты в последнее время так усердно начал открещиваться от программинга? - повышение получил что ли? 

Опять не догнал? Что значит открещиваться от программинга?

ты про это?
Цитата

ЗЫ
dumb, загадками говоришь, а загадки связанные с программированием не мой конек...

Автор: mes 6.5.2009, 15:24
Dmi3ev, 
Цитата(dumb @  6.5.2009,  11:11 Найти цитируемый пост)
пытаться экономить на соглашениях вызова/инлайнах - тоже занятие то еще...


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)