我正在阅读有关virtual table的内容。当指针__vptr
时,
由作者说明
与
*this
指针不同,*__vptr
指针实际上是编译器用来解析自引用的函数参数,this
是一个真正的指针。因此,它使每个类对象的分配大于一个指针的大小。
这里说this
实际上是一个函数参数是什么意思? ITelephony
不是真正的指针吗?
答案 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 register由inlined(以及最新optimizing compiler我们在编写优化编译器时编写了C ++ 14标准;另请参阅C++11)。在这种情况下,this
存储在哪里的问题实际上变得毫无意义......(因为内联)。
this(vtable)通常是对象的隐式第一指针字段(或实例变量),但事情可能会变得更加复杂,例如:虚拟virtual method table。 vtable数据本身(virtual
函数的地址)由编译器生成。另请参阅multiple inheritance。
理论上,C ++实现可以通过另一种机制提供this answer而不是vtable。在实践中,我知道没有C ++实现这样做。