Zasady i ograniczenia dotyczące funkcji bez nadruku
Programu Microsoft
Do funkcji nagi stosuje się następujące zasady i ograniczenia:
return Instrukcja nie jest dozwolone.
Konstrukcje strukturalnej obsługi wyjątków i sposób obsługi wyjątków C++ nie są dozwolone, ponieważ muszą one relaks całej ramki stosu.
Z tego samego powodu jakiejkolwiek formy setjmp jest zabronione.
Korzystanie z _alloca funkcja jest zabronione.
W celu zapewnienia, że żaden kod inicjowania dla zmiennych lokalnych pojawia się przed sekwencji prologu, zainicjować zmiennych lokalnych nie są dozwolone w zakresie funkcji.W szczególności deklarację obiekty C++ nie jest dozwolone na zakres funkcji.W zakresie zagnieżdżonych jednak może być zainicjowane dane.
Optymalizacja wskaźnik ramki (opcja kompilatora /Oy) nie jest zalecane, ale nie jest automatycznie wyświetlany dla funkcji bez nadruku.
Nie można zadeklarować obiekty klas C++ w zakresie leksykalne funkcji.Można jednak zadeklarować obiekty zagnieżdżonego bloku.
naked Słowo kluczowe jest ignorowany podczas kompilacji z /CLR.
Dla __fastcall funkcje bez nadruku, w każdym przypadku, gdy występuje odwołanie w kodzie C/C++, aby jeden z argumentów rejestru, kod prolog powinny być przechowywane wartości rejestru do lokalizacji stosu dla tej zmiennej.Na przykład:
// nkdfastcl.cpp
// compile with: /c
// processor: x86
__declspec(naked) int __fastcall power(int i, int j) {
// calculates i^j, assumes that j >= 0
// prolog
__asm {
push ebp
mov ebp, esp
sub esp, __LOCAL_SIZE
// store ECX and EDX into stack locations allocated for i and j
mov i, ecx
mov j, edx
}
{
int k = 1; // return value
while (j-- > 0)
k *= i;
__asm {
mov eax, k
};
}
// epilog
__asm {
mov esp, ebp
pop ebp
ret
}
}