我需要知道是否,何时在C ++中一个类的方法被调用时,隐式this指针是第一个参数,或最后。 即:无论是压入堆栈第一或最后。
换句话说,我要问一个类的方法,无论是被称为,采取的是编译器为:
int foo::bar(foo *const this, int arg1, int arg2);
//or:
int foo::bar(int arg1, int arg2, foo *const this);
通过扩展,因此,更重要的是,这也将回答G ++是否将推动这个指针最后还是第一,分别。 我询问谷歌,但我没有找到太多。
而作为一个方面说明,当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 ++ 64位,前四个参数在寄存器传递。 这是第一个参数,并在RCX寄存器传递。
雷蒙德陈了一系列几年前就调用约定。 这里有86和64篇。
这将取决于你的编译器和架构,但在G ++ 4.1.2在Linux上没有优化设置,它把this
作为第一个参数,在寄存器传递:
class A
{
public:
void Hello(int, int) {}
};
void Hello(A *a, int, int) {}
int main()
{
A a;
Hello(&a, 0, 0);
a.Hello(0, 0);
return 0;
}
主拆卸():
movl $0, 8(%esp)
movl $0, 4(%esp)
leal -5(%ebp), %eax
movl %eax, (%esp)
call _Z5HelloP1Aii
movl $0, 8(%esp)
movl $0, 4(%esp)
leal -5(%ebp), %eax
movl %eax, (%esp)
call _ZN1A5HelloEii
我刚结束了C ++标准的读(ANSI ISO IEC 14882 2003),第9.3.2节“this指针”,它似乎并没有指定有关它应该出现在参数列表中任何东西,所以它是由个别编译器。
尝试编译使用“-S”标志生成汇编代码,并看看它在做什么一些代码用gcc。
不是由C ++标准中规定的这种类型的细节被。 然而,通过阅读C ++ ABI对于GCC(和随后的C ++ ABI其他C ++编译器)。