C++编译器是为所有成员方法生成指针"this"还是仅为引用成员的方法生成指针?



c++编译器是否为所有成员方法生成隐藏的"this"指针,还是仅为那些引用成员的指针?

简短的回答:是的。

更长的回答:好吧,如果它不使用任何成员变量,为什么它首先是一个成员函数[而不是一个静态成员函数]。(是的,可能在某些情况下,接口提供的成员方法没有对任何成员内容做任何事情,因为它只是做一些事情,比如在错误类型上调用该函数时打印错误消息,或者它是"我们有时需要这个函数",在不需要做任何事情的情况下,它是一个空函数)。

因为我们可以在编译器不知道成员函数实际做什么的情况下使用它(例如,在函数的"use"one_answers"definition"不同的源文件的情况下),编译器必须对所有调用遵循相同的调用约定,无论是否实际需要this指针。当然,如果代码对编译器可见,它可以内联函数,或者在允许这样做的情况下进行优化,生成更好的代码。但是,如果编译器不知道更好的方法,则"默认"是将this传递给函数,无论是否实际需要。

引自c++标准(Draft 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)

最新更新