c++ - C++ 隐含了这个,以及它是如何被压入堆栈的

标签 c++ assembly stack pointers this

我需要知道,当调用 C++ 中的类方法时,隐式“this”指针是第一个参数还是最后一个参数。即:它是先入栈还是最后入栈。

换句话说,我是在询问一个被调用的类方法是否被编译器认为是:

int foo::bar(foo *const this, int arg1, int arg2); 
//or:
int foo::bar(int arg1, int arg2, foo *const this);

因此,通过扩展,更重要的是,这也将回答 G++ 是将 this 指针分别压入最后还是最先。我查询了谷歌,但没有找到太多。

另外,当调用 C++ 函数时,它们是否与 C 函数执行相同的操作?即:

push ebp
mov ebp, esp

总而言之:被调用的类方法看起来像这样吗?

; About to call foo::bar.
push dword 0xDEADBEEF
push dword 0x2BADBABE
push dword 0x2454ABCD ; This one is the this ptr for the example.
; this code example would match up if the this ptr is the first argument.
call _ZN3foo3barEpjj

谢谢,非常感谢。

编辑:为了澄清问题,我使用的是 GCC/G++ 4.3

最佳答案

这取决于您的编译器的调用约定和目标架构。

默认情况下,Visual C++ 不会将其压入堆栈。对于 x86,编译器将默认使用“thiscall”调用约定并将其传递到 ecx 寄存器中。如果为成员函数指定 __stdcall,它将作为第一个参数压入堆栈。

对于 VC++ 上的 x64,前四个参数在寄存器中传递。这是第一个参数,传入rcx寄存器。

Raymond Chen 几年前有一个关于调用约定的系列。这是 x86x64文章。

关于c++ - C++ 隐含了这个,以及它是如何被压入堆栈的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1297205/

相关文章:

c - 无法编译或链接调用 c 函数的 yasm 程序

c++ - 在链表中实现 push/pop (C++)

C++ 映射唯一类并从值中提取子类

c++ - PyModule_AddObject 崩溃

c++ - 错误: ‘ ’ may be used uninitialized in this function [-Werror=maybe-uninitialized]

assembly - BIOS INT 13H 问题(从驱动器读取扇区)

c++ - 不兼容的转换字符

c - 从管理员权限应用程序读取 cpu 控制寄存器的值 (Windows)

c - GCC - 如何重新对齐堆栈?

c - 为什么编译器不能导出字符串数组的字符串长度?