这不是真正的指针吗?

时间:2015-07-04 13:38:49

标签: c++ pointers this

我正在阅读有关virtual table的内容。当指针__vptr时, 由作者说明

  

*this指针不同,*__vptr指针实际上是编译器用来解析自引用的函数参数,this是一个真正的指针。因此,它使每个类对象的分配大于一个指针的大小。

这里说this实际上是一个函数参数是什么意思? ITelephony不是真正的指针吗?

2 个答案:

答案 0 :(得分:7)

这两个指针都是真实的,因为它们在内存中存储了其他内容的地址。通过"真实"作者意味着"存储在类"中,而不是this指针,它被传递给成员函数而不存储在对象本身中。本质上,指向__vptr的指针是对象的一部分,而this指针则不是。

答案 1 :(得分:3)

this 总是隐藏的隐式形式参数。实际上,static的每个非class成员函数都会得到一个隐含的第一个参数this

所以在

class Foo {
  int x; // a field, i.e. an instance variable
  void bar(double x);
};

Foo::bar函数有两个参数,就像它是C(不是C ++)函数一样

void Foo__bar(Foo* mythis, double x);

实际上,name mangling和编译器正在将第一个转换为与第二个非常接近的等价物。 (我使用mythis代替this,因为this是C ++中的关键字。)

原则上,您的实现的ABI可以为this强制执行不同的传递约定(例如,使用另一个机器寄存器)和其他显式参数。在实践中,它通常不会。在我的Linux系统上,x86-64 ABI(图3.4第21页)定义了一个calling convention,它在this {{3}中传递%rdi(以及C函数的第一个指针形式参数) }}

实际上,在C ++中,大多数但不是所有成员函数都很小(在class中定义)和processor registerinlined(以及最新optimizing compiler我们在编写优化编译器时编写了C ++ 14标准;另请参阅C++11)。在这种情况下,this存储在哪里的问题实际上变得毫无意义......(因为内联)。

this(vtable)通常是对象的隐式第一指针字段(或实例变量),但事情可能会变得更加复杂,例如:虚拟virtual method table。 vtable数据本身(virtual函数的地址)由编译器生成。另请参阅multiple inheritance

理论上,C ++实现可以通过另一种机制提供this answer而不是vtable。在实践中,我知道没有C ++实现这样做。