即使存在聲明的隱式'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