即使存在声明的隐式'this'指针,没有数据成员的类的大小也会返回为1个字节。不应该返回大小是4字节(在32位机器上)?我遇到了一些文章,指出为了计算对象的大小,这个“指针”不计算在内。但我无法理解这个原因。 另外,如果任何成员函数声明为虚拟的,则该类的大小现在返回为4个字节。这意味着vptr被计算用于计算对象的大小。为什么考虑vptr并且忽略用于计算对象大小的'this'指针?具有'this'指针的类的大小
回答
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);
“这个”不存储在类的数据成员,它只是一个“指针”的类的实例。将其视为传递给该方法的“隐藏参数”。事实上,在Win32系统中,它通常被传入ecx寄存器(不像最初我想的那样是eax)。
只要有一个或多个虚拟方法,应用程序就需要一种方法来存储指向虚拟方法的指针。这称为vtable,对于同一个类的所有实例来说,它是相同的。由于您需要在运行时知道哪个“显式”方法要调用哪个'虚方法'指向vtable的指针存储在类实例中。因此,vtable指针(或vptr)需要4个字节(或64位系统上的8个字节)。
该指针不存储在对象内部。没有必要这样做。您已经有一个指针或一个对象来调用这些函数。至于1的大小,C++标准要求distict对象具有不同的地址。
指针的大小始终是需要存储在内存中的指针类型的大小。
例如,如果一个int的存储器地址是32位上的64位体系结构,然后
INT A = 10; int * b =&a; (b); // 32 sizeof(& b); 64
。 – PlasmaHH 2012-06-01 08:24:02
- 1. 类内的“this”指针
- 2. 'this'指针,继承超类的子类中使用'this'指针的函数
- 3. 指针的大小
- 4. 查找指针的大小
- 5. C中指针的大小
- 6. 指针向量的大小
- 7. 如何删除具有指针成员的类的指针?
- 8. 带有显式“this”指针的代表?
- 9. “this”指针的等价物
- 10. 'this'指针的错误
- 11. 指向int类型数组的指针的大小是多少?
- 12. UML:当一个类具有指向其他类的指针参数指针时
- 13. 为什么指向函数的指针的大小与指向成员函数的指针的大小不同?
- 14. 's'的存储大小是未知的+指针指针
- 15. 这个指针由Object(this)设置!= this
- 16. 具有变量(有点)类型的类指针字段?
- 17. 没有法律转化为this指针
- 18. 多继承:虚拟指针的类的大小?
- 19. 调整大小的指针向量segfaults
- 20. 由malloc分配的指针大小
- 21. C - 字符的内存大小指针
- 22. 是相同大小的指针?
- 23. 指针访问数组的大小
- 24. C++“this”指针在for_each
- 25. “this”指针变化回溯
- 26. C++:了解“this”指针
- 27. C++使用“this”指针作为一个正常的指针
- 28. 指针指针之类的指针之类的算术
- 29. 如何从基指针中知道派生类的大小?
- 30. 带有两个无效指针的struct的大小是4?
重复: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