C++ c++;标准指定如何将此指针传递给成员函数?

C++ c++;标准指定如何将此指针传递给成员函数?,c++,C++,大多数人都知道,类成员接收this指针作为函数的第一个“不可见”参数。 这是C++标准中指定的吗?某个编译器实现可以以不同的方式传递它吗?例如,专用的注册表。< P>这是如何实现C++的第一个版本(早期C++被转换成C代码),但是请确保C++标准执行 > < /强>任务。 将其作为最后一个参数值也似乎是可行的,对于虚函数,也有一些不同的技术。 < P>这当然是C++的第一个版本是如何实现的(早期C++被转换成C代码),但是请确保C++标准做了不>强>任务。 将其作为最后一个参数值传递似乎也是可行

大多数人都知道,类成员接收this指针作为函数的第一个“不可见”参数。
这是C++标准中指定的吗?某个编译器实现可以以不同的方式传递它吗?例如,专用的注册表。

< P>这是如何实现C++的第一个版本(早期C++被转换成C代码),但是请确保C++标准执行<强> > < /强>任务。


将其作为最后一个参数值也似乎是可行的,对于虚函数,也有一些不同的技术。

< P>这当然是C++的第一个版本是如何实现的(早期C++被转换成C代码),但是请确保C++标准做了<强>不>强>任务。
将其作为最后一个参数值传递似乎也是可行的,而对于虚拟函数,则需要一些完全不同的技术。

该标准对寄存器一无所知——这些都是无关的实现细节。该标准仅规定了一致性程序必须产生哪些可观察的副作用。实现可以随心所欲地实现这些副作用。另请参见:如何传递参数(包括隐含的
参数)是给定平台ABI的问题,而不是语言标准。在现代ABI中,大多数参数都在CPU寄存器中传递。调用约定肯定会规定这一点。这可以明确地指定,这样编译器就会认为默认为“代码> CCDL< <代码>或使用指定的“@ LFGTM”调用约定……可以明确地指定“C++标准没有提供任何方式来做,也没有提到术语“调用约定”。任何这样的机制都必须是特定于实现的。“某个编译器实现可以以不同的方式传递它吗?例如,专用注册表。”MSVC只是这样做-
这个
在ECX寄存器中传递,其余的参数都放在堆栈上,标准对寄存器一无所知——这些都是无关的实现细节。该标准仅规定了一致性程序必须产生哪些可观察的副作用。实现可以随心所欲地实现这些副作用。另请参见:如何传递参数(包括隐含的
参数)是给定平台ABI的问题,而不是语言标准。在现代ABI中,大多数参数都在CPU寄存器中传递。调用约定肯定会规定这一点。这可以明确地指定,这样编译器就会认为默认为“代码> CCDL< <代码>或使用指定的“@ LFGTM”调用约定……可以明确地指定“C++标准没有提供任何方式来做,也没有提到术语“调用约定”。任何这样的机制都必须是特定于实现的。“某个编译器实现可以以不同的方式传递它吗?例如,专用注册表。”MSVC只是这样做-
这个
在ECX寄存器中传递,其余的参数都放在堆栈上。有人知道编译器没有将
这个
作为第一个参数传递吗?@AndyG MSVC。在ECX寄存器上传递
,而参数在堆栈上传递。
虚拟
函数,至少在某些编译器(如MSVC)上,有时使用调整器thunk来协助调用特定版本。如果类
A
B
C
定义
virtual void func()
,并且派生类
ABC:public A、public B、public
重写
func()
,MSVC将生成两个thunk:一个用于在调用
ABC::B::func()
时调整
指针的地址,当调用
ABC::C::func()
时,可以对其进行调整。(在我的测试中,
A
不会得到一个,因为
A
ABC
的字节0开始,因此任何实例的
ABC*this
及其
A*this
指向同一地址。)当然,只有从多个基类继承时才会出现这个问题,其中两个或多个定义了具有相同签名的虚拟函数,并且该函数随后被派生类重写。但是,它仍然是编译器在处理
this
和虚拟函数时使用的技术之一。有人知道编译器不将
this
作为第一个参数传递吗?@AndyG MSVC。在ECX寄存器上传递
,而参数在堆栈上传递。
虚拟
函数,至少在某些编译器(如MSVC)上,有时使用调整器thunk来协助调用特定版本。如果类
A
B
C
定义
virtual void func()
,并且派生类
ABC:public A、public B、public
重写
func()
,MSVC将生成两个thunk:一个用于在调用
ABC::B::func()
时调整
指针的地址,当调用
ABC::C::func()
时,可以对其进行调整。(在我的测试中,
A
不会得到一个,因为
A
ABC
的字节0开始,因此任何实例的
ABC*this
及其
A*this
指向同一地址。)当然,只有从多个基类继承时才会出现这个问题,其中两个或多个定义了具有相同签名的虚拟函数,并且该函数随后被派生类重写。但是,它仍然是编译器在处理
this
和虚拟函数时使用的技术之一。