C++ 编译器是为所有成员方法生成隐藏的“this”指针,还是只为那些引用成员的方法生成隐藏的“this”指针?
5 回答
简短的回答:是的。
更长的答案:好吧,如果它不使用任何成员变量,为什么它首先是成员函数[而不是静态成员函数]。(是的,在某些情况下,接口提供的成员方法对任何成员内容都不做任何事情,因为它只是在做一些事情,比如打印错误消息以在错误的类型上调用此函数,或者它是“我们需要this 有时函数”,并且在不需要做任何事情的情况下,它是一个空函数)。
由于我们可以在编译器不知道其实际作用的情况下使用成员函数(例如,在函数的“使用”和“定义”不同的源文件的情况下),编译器必须对所有调用遵循相同的调用约定,this
指针是否真的需要。当然,如果代码对编译器可见,则它内联函数或以其他方式可以进行优化,从而在允许的情况下产生更好的代码。但是,如果编译器不知道更好,则“默认”是传递this
给函数,无论它是否真的需要。
引用 C++ 标准(草案 N3242):
9.3.2 this 指针
1 在非静态 (9.3) 成员函数的主体中,关键字 this 是纯右值表达式,其值是调用该函数的对象的地址。
我认为这意味着它存在于所有成员函数中。
“C++ 编译器”的行为可能完全不同,这取决于他在空间和时间的确切点上是谁。
也就是说,大多数编译器实现类和对象的方式this
是类的每个实例的一部分。这意味着,它可以在对象的完整范围内访问。
C++ 中的每个对象都可以通过称为 this 指针的指针访问自己的地址。指针是所有成员函数的this
隐式参数。友函数没有this
指针。只有成员函数有this
指针。
class Interval
{
public:
long GetTime()
{
//Code
}
void SetTime(long value)
{
//Code
}
}
假设您已经编写了这段代码。编译器会自动添加 this 指针。当您查看编译器为您的程序编写的代码时,它就会出现在您面前。
编译器会添加如下:
void Interval::SetTime(Interval* this, long value)