2010-03-18 75 views
7

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

+0

重复:http://stackoverflow.com/questions/621616/c-what-is-the-size-of-an-object-of-an-empty-class http://stackoverflow.com/questions/2362097/empty-class-in-c – 2010-03-18 07:39:18

回答

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); 
4

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

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

+1

我认为这是通过'ecx'传递的。 – Blindy 2010-03-18 08:05:39

+0

糟糕,是的,你是对的。 eax用于返回值。除了sizeof()返回的是字节数,而不是bits,sizeof(int *)和sizeof(int **)不能不同,(我编辑的帖子) – Patrick 2010-03-18 17:19:53

2

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

-1

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

例如,如果一个int的存储器地址是32位上的64位体系结构,然后

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

+0

。 – PlasmaHH 2012-06-01 08:24:02