Visual C ++版本的GCC函数

时间:2009-08-18 02:12:21

标签: c++ visual-c++ gcc g++

是否有以下的Visual C ++版本(在GCC中)?

  1. __builtin_return_address
  2. __builtin_frame_address
  3. 参考 - http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html

    如果没有,有没有办法模仿它们?

    感谢。

4 个答案:

答案 0 :(得分:5)

以下是可用Visual Studio 2008 Compiler Intrinsics的完整列表。你在这里特别寻找的一个是_ReturnAddress ......还在寻找另一个。

为了遍历堆栈(并获取帧指针),请阅读Visual Leak Detector stack walking mechanism上的详细信息,该内部使用StackWalk64

答案 1 :(得分:1)

对于声明为__cdecl的函数,帧地址是函数堆栈的顶部(由esp指向,并由sizeof函数的参数调整)。我相信GCC通常会在ebp中存储当前函数的指针(不确定VS)。该内存位置是一个指针,并保存返回地址。

对于声明为__fastcall的函数,对esp的调整要小得多,因为某些函数的参数可能已在寄存器中传递。

我不确定__stdcall,但我认为__cdecl相同。

答案 2 :(得分:1)

__builtin_frame_address的相应函数(如果存在)可能在优化代码中不起作用,因为VC执行称为帧指针省略的优化。但是,您可以关闭此优化,如下所述: http://msdn.microsoft.com/en-us/library/2kxx5t2c(VS.71).aspx

请注意,对于x86,您可以编写内联汇编代码 http://msdn.microsoft.com/en-us/library/4ks26t93(VS.71).aspx 遗憾的是,它不适用于64位体系结构,因此可能对您没有帮助。

答案 3 :(得分:0)

您可以使用_AddressOfReturnAddress来确定帧地址。