3

C++ 编译器是为所有成员方法生成隐藏的“this”指针,还是只为那些引用成员的方法生成隐藏的“this”指针?

4

5 回答 5

5

简短的回答:是的。

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

由于我们可以在编译器不知道其实际作用的情况下使用成员函数(例如,在函数的“使用”和“定义”不同的源文件的情况下),编译器必须对所有调用遵循相同的调用约定,this指针是否真的需要。当然,如果代码对编译器可见,则它内联函数或以其他方式可以进行优化,从而在允许的情况下产生更好的代码。但是,如果编译器不知道更好,则“默认”是传递this给函数,无论它是否真的需要。

于 2013-05-19T16:04:05.887 回答
0

引用 C++ 标准(草案 N3242):

9.3.2 this 指针

1 在非静态 (9.3) 成员函数的主体中,关键字 this 是纯右值表达式,其值是调用该函数的对象的地址。

我认为这意味着它存在于所有成员函数中。

于 2013-05-19T16:01:37.163 回答
0

“C++ 编译器”的行为可能完全不同,这取决于他在空间和时间的确切点上是谁。

也就是说,大多数编译器实现类和对象的方式this是类的每个实例的一部分。这意味着,它可以在对象的完整范围内访问。

于 2013-05-19T16:02:15.513 回答
0

C++ 中的每个对象都可以通过称为 this 指针的指针访问自己的地址。指针是所有成员函数的this隐式参数。友函数没有this指针。只有成员函数有this指针。

于 2013-05-19T16:04:10.587 回答
0
class Interval
{
    public:
       long GetTime()
       {
           //Code
       }

       void SetTime(long value)
       {
           //Code
       }
}

假设您已经编写了这段代码。编译器会自动添加 this 指针。当您查看编译器为您的程序编写的代码时,它就会出现在您面前。

编译器会添加如下:

void Interval::SetTime(Interval* this, long value)
于 2016-12-09T05:47:10.020 回答