_ReturnAddress
Khusus Microsoft
Intrinsik _ReturnAddress
menyediakan alamat instruksi dalam fungsi panggilan yang akan dijalankan setelah kontrol kembali ke pemanggil.
Bangun program berikut dan lakukan langkah-langkah di debugger. Saat Anda menelusuri program, perhatikan alamat yang dikembalikan dari _ReturnAddress
. Kemudian, segera setelah kembali dari fungsi tempat _ReturnAddress
digunakan, buka Jendela Cara: Gunakan Jendela Pembongkaran dan perhatikan bahwa alamat instruksi berikutnya yang akan dijalankan cocok dengan alamat yang dikembalikan dari _ReturnAddress
.
Pengoptimalan seperti inlining dapat memengaruhi alamat pengembalian. Misalnya, jika program sampel di bawah ini dikompilasi dengan /Ob1, inline_func
akan disebarkan ke dalam fungsi panggilan, main
. Oleh karena itu, panggilan ke _ReturnAddress
dari inline_func
dan main
masing-masing akan menghasilkan nilai yang sama.
Ketika _ReturnAddress
digunakan dalam program yang dikompilasi dengan /clr, fungsi yang berisi _ReturnAddress
panggilan akan dikompilasi sebagai fungsi asli. Ketika fungsi yang dikompilasi sebagai panggilan terkelola ke dalam fungsi yang berisi _ReturnAddress
, _ReturnAddress
mungkin tidak berulah seperti yang diharapkan.
Persyaratan
File header<intrin.h>
Contoh
// compiler_intrinsics__ReturnAddress.cpp
#include <stdio.h>
#include <intrin.h>
#pragma intrinsic(_ReturnAddress)
__declspec(noinline)
void noinline_func(void)
{
printf("Return address from %s: %p\n", __FUNCTION__, _ReturnAddress());
}
__forceinline
void inline_func(void)
{
printf("Return address from %s: %p\n", __FUNCTION__, _ReturnAddress());
}
int main(void)
{
noinline_func();
inline_func();
printf("Return address from %s: %p\n", __FUNCTION__, _ReturnAddress());
return 0;
}
END Khusus Microsoft