带有'this'指针的类的大小

时间:2010-03-18 07:33:55

标签: c++ sizeof

没有数据成员的类的大小返回为1个字节,即使声明了一个隐式的“this”指针。返回的大小不应该是4个字节(在32位机器上)?我遇到过一些文章,表明“this”指针不计算在于计算对象的大小。但我无法理解这个原因。 此外,如果任何成员函数声明为virtual,则类的大小现在返回为4个字节。这意味着计算vptr以计算对象的大小。为什么在计算对象大小时会考虑vptr并忽略'this'指针?

4 个答案:

答案 0 :(得分:6)

this指针不是该类的成员。它只是一个构造,用于属于该类的方法以引用当前实例。

如果您有这样的课程:

class IntPair
{
public:
  IntPair(int a, int b) : _a(a), _b(b) { }

  int sum() const { return _a + _b; }

public:
  int _a;
  int _b;
};

对于每个实例,此类仅需要int的两个实例的空间。一旦你创建了一个实例并且正在运行sum()方法,那么用指向实例的指针调用该方法,但该指针总是来自其他地方,它不存储在对象实例中。

例如:

IntPair *fib12 = new IntPair(89, 144);

cout << fib12->sum();

注意成为this指针的变量如何在创建它的范围内对象存储。

实际上,您可以将上述方法转换为:

static int sum2(const IntPair* instance)
{
  return instance->_a + instance->_b;
}

如果上面是在类中定义的(因此可以访问私有成员),那就没有区别了。实际上,这个如何在场景后面实现方法; this指针只是所有成员方法的隐藏参数。

电话会变成:

IntPair* fib12 = new IntPair(89, 144);

cout << IntPair::sum2(fib12);

答案 1 :(得分:4)

'this'不是作为数据成员存储在类中,它只是指向类实例的“指针”。将其视为传递给方法的“隐藏参数”。实际上,在Win32系统上,它通常在ecx寄存器中传递(不像我最初想的那样)。

只要有一个或多个虚拟方法,您的应用程序就需要一种方法来存储指向虚方法的指针。这称为vtable,对于同一类的所有实例都是相同的。由于您需要在运行时知道调用“虚方法”的“显式”方法,因此将指向vtable的指针存储在类实例中。因此,vtable-pointer(或vptr)需要4个字节(或64位系统上的8个字节)。

答案 2 :(得分:2)

此指针未存储在对象内。没有必要这样做。您已经有一个指针或对象来调用函数。至于大小为1,C ++标准要求distict对象具有不同的地址。

答案 3 :(得分:-1)

指针的大小始终是需要存储在内存中的指针类型的大小。

例如,如果int的内存地址在64位架构上是32位,那么

int a = 10; int * b =&amp; a; sizeof(b); // 32 sizeof(&amp; b); 64