Что значат __cdecl, __fastcall, и __stdcall специфики функций?
Объясните кто-нибудь понятным языком, что они делают, для чего были внедрены и где и зачем их применять?
А то чтото MSDN очень лаконичен.
:: Into my SONY MDR-R10 sound "Nine Inch Nails — Starfuckers Inc. (D. Ogilvie mix)" ::
Re: Что обозначают __cdecl, __fastcall, и __stdcall?
Здравствуйте, LaFlour, Вы писали:
LF>Что значат __cdecl, __fastcall, и __stdcall специфики функций? LF>Объясните кто-нибудь понятным языком, что они делают, для чего были внедрены и где и зачем их применять?
LF>А то чтото MSDN очень лаконичен.
__cdecl — отсутствие декорации имен. Применять в том случае, если в C++ используешь функцию, которую написали на C или наоборот, на С++ пишешь функцию для C.
__fastcall — передача части параметров и результата не через стек, а через регистры. Для оптимизации применяется.
__stdcall — оно же PASCAL — противоположный C-шному договор о передаче параметров в функцию и о том, кто после выполнения функции чистит стек. Применяется в Win API.
... << RSDN@Home 1.0 beta 3 >>
Кр-ть — с.т.
Re: Что обозначают __cdecl, __fastcall, и __stdcall?
Здравствуйте, LaFlour, Вы писали:
LF>Что значат __cdecl, __fastcall, и __stdcall специфики функций? LF>Объясните кто-нибудь понятным языком, что они делают, для чего были внедрены и где и зачем их применять?
LF>А то чтото MSDN очень лаконичен.
Эти спецификаторы определяют порядок следования аргументов на стеке и сторону, которая стек очищает (caller или callee).
Re: Что обозначают __cdecl, __fastcall, и __stdcall?
Здравствуйте, LaFlour, Вы писали:
LF>Что значат __cdecl, __fastcall, и __stdcall специфики функций? LF>Объясните кто-нибудь понятным языком, что они делают, для чего были внедрены и где и зачем их применять?
LF>А то чтото MSDN очень лаконичен.
LF>
Это есть так называемые calling convention, т.е. способы вызова функций (вернее способ передачи параметров):
как известно, перед вызовом функции ее параметры складываются в стэк
__cdecl — после вызова функции параметры из стэка удаляет вызывающая сторона
__stdcall — после вызова функции параметры из стэка удаляет сама эта функция
__fastcall — похожа на __stdcall, но часть параметров пытается передать через регистры.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Что обозначают __cdecl, __fastcall, и __stdcall?
A>__cdecl — отсутствие декорации имен. Применять в том случае, если в C++ используешь функцию, которую написали на C или наоборот, на С++ пишешь функцию для C. A>
Ой.. это я с extern "C" спутал на самом деле __cdecl — это С-шный порядок аргументов по-умолчанию.
... << RSDN@Home 1.0 beta 3 >>
Кр-ть — с.т.
Re[2]: Что обозначают __cdecl, __fastcall, и __stdcall?
A>__cdecl — отсутствие декорации имен. Применять в том случае, если в C++ используешь функцию, которую написали на C или наоборот, на С++ пишешь функцию для C. A>__fastcall — передача части параметров и результата не через стек, а через регистры. Для оптимизации применяется. A>__stdcall — оно же PASCAL — противоположный C-шному договор о передаче параметров в функцию и о том, кто после выполнения функции чистит стек. Применяется в Win API. A>
Неточно!
; F(A,B,C,D)
_cdecl: ; прямой порядок расположения данных на стеке
; обратный по времени способ запихивания
; допускает переменное число параметров
; поскольку стек очищает тот, кто вызвал функцию
push D
push C
push B
push A
call F
; ret
inc esp, 16 ; очистка стека здесь
_stdcall: ; порядок данных - тот же самый
; но стек очищает функция
; поэтому число параметров фиксировано
push D
push C
push B
push A
call F
; ret 16 ; очистка стека - в функции
_fastcall: ; аналогично stdcall, но два первых параметра передаются через регистры
push D
push C
mov edx, B
mov eax, A
call F
; ret 8 ; очистка стека - в функции
_pascal: ; обратный порядок данных на стеке, прямой порядок запихивания
; поэтому число параметров фиксировано, и следовательно, стек очищает функция
push A
push B
push C
push D
call F
; ret 16