[C++] __fastcall co to daje ?

0

Hej!
Czy pisząc własną funkcje np do istniejącej klasy trzeba zawsze uzywac fastcal??
tzn __fastcall
W dokumentacj :

Functions
Forces register parameter passing convention. Affects the linker and link-time names.

W dokumentacji Microsoftu

Microsoft Specific

The __fastcall calling convention specifies that arguments to functions are to be passed in registers, when possible. The following list shows the implementation of this calling convention.

Element Implementation
Argument-passing order The first two DWORD or smaller arguments are passed in ECX and EDX registers; all other arguments are passed right to left.
Stack-maintenance responsibility Called function pops the arguments from the stack.
Name-decoration convention At sign (@) is prefixed to names; an at sign followed by the number of bytes (in decimal) in the parameter list is suffixed to names.
Case-translation convention No case translation performed.

Note Future compiler versions may use different registers to store parameters.
Using the /Gr compiler option causes each function in the module to compile as fastcall unless the function is declared with a conflicting attribute, or the name of the function is main.

Czy jak np do klasy TForm dopisze sobie funkcję
np

void __fastcall TForm1::MojaFunkcja()
{
//tresc funkcji
}
0

Czy pisząc własną funkcje np do istniejącej klasy trzeba zawsze uzywac fastcal??
tzn __fastcall

Nie. To jest jeden z wielu sposobów wywołania funkcji - tzn. przekazywania parametrów i ściągania ich ze stosu (jeżeli w ogóle na nim są). W przypadku __fastcall dwa pierwsze parametry przekazywane są w rejestrach ecx i edx. Funkcja zdejmuje parametry ze stosu.

Czy jak np do klasy TForm dopisze sobie funkcję
np

void __fastcall TForm1::MojaFunkcja()
{
//tresc funkcji
}

to???

0

Oj pomylka

void __fastcall TForm1::MojaFunkcja(int elementy)
{
//tresc funkcji
}
0

No i? :>

0

No i czy jak jest __fastcall to będzie szybciej działać wykonanie tej funkcji niż bez __fastcall

0

Tak. this i int będzie przekazany w rejestrach.

0

Ok:-)
Ale czy to jest odczuwalna różnica w szybkości działania??
Czy raczej to będzie odczuwalne przy tworzeniu grafiki, czy skomplikowanych operacjach matematycznych?Bo chyba przy wyszukiwaniu danych w pliku tekstowym __fastcall dużo nie przyspieszy...

0

Zysk mały. Zresztą większy wpływ na wydajność ma to, co jest w danej funkcji, a nie sposób jej wywołania.

0

Guzik tam nie szybciej, jak beda rejestry do czegos potrzebne to i tak trzeba bedzie odlozyc parametr na stos :)

0

Mam być szczery? Fastcall potrafi czasem być wolniejszy od stdcall - często przy bardziej skomplikowanych funkcjach i tak zmienne z ecx i edx idą na stos, do zmiennych lokalnych, przygotowanie zaś argumentów w rejestrach do wywołania w tej konwencji tez czasem kosztuje. Zwykle jednak fastcall jeżeli kompilator się spisze będzie o te kilka cykli szybszy. Inna sprawa, to to, że niektóre kompilatory dodają zawsze prolog i epilog obsługujący ramkę stosu, nawet gdy nie jest ona konieczna, traci na tym wydajność.

0
deus napisał(a)

Mam być szczery? Fastcall potrafi czasem być wolniejszy od stdcall - często przy bardziej skomplikowanych funkcjach i tak zmienne z ecx i edx idą na stos, do zmiennych lokalnych, przygotowanie zaś argumentów w rejestrach do wywołania w tej konwencji tez czasem kosztuje. Zwykle jednak fastcall jeżeli kompilator się spisze będzie o te kilka cykli szybszy. Inna sprawa, to to, że niektóre kompilatory dodają zawsze prolog i epilog obsługujący ramkę stosu, nawet gdy nie jest ona konieczna, traci na tym wydajność.

Ciekawe jak to robi Turbo C++ :>

0

Jak? Borland od zawsze stosował fastcall. Prolog z epilog z tego co pamiętam również zawsze...

1 użytkowników online, w tym zalogowanych: 0, gości: 1