2014-01-12 140 views
5

在C++中,該指針作爲一個隱藏的參數傳遞給方法,該參數實際上指向當前對象,但'this'指針存儲在內存中......堆棧,堆,數據?分配'this'指針的內存

+0

假設你的意思是你的代碼在調用某個方法的時候知道'this'是什麼......它取決於許多因素會有所不同,但是你肯定可以猜測或者看看你的編譯器產生一個想法。 – asveikau

+0

我讀過'this'實際上並不是指針,它的表達是真的嗎? – nilesh

+0

[存儲在計算機內存中的'this'指針在哪裏?](http://stackoverflow.com/questions/16585562/where-is-the-this-pointer-stored-in-computer-memory)的精確副本 –

回答

6

的標準沒有規定的this指針的存儲位置。

當它在該函數的調用中傳遞給成員函數時,一些編譯器將其傳遞到一個寄存器中,而其他編譯器則將其傳遞到堆棧上。它也可以依賴於編譯器選項。

關於唯一可以確定的是this是一個右值的基本類型,所以你不能接受它的地址。

這並不總是那樣。

在預標準C++中,您可以指定爲this,例如,以指示構造函數失敗。這是在引入例外之前。指示構造失敗的現代標準方法是拋出一個異常,這保證了有序的清理(如果沒有被用戶代碼挫敗,例如臭名昭​​着的MFC位置new錯誤)。

1

在C++中,this是「簡單地」指向當前對象的指針。它允許您訪問特定於對象的數據。

例如,當在一個類中的代碼具有以下片段:

this->temperature = 40.0f; 

它設置爲任何對象被作用時的溫度(假定temperature不是類級靜態時,所有對象之間共享的類)。

this指針本身不必分配(就動態內存而言),它完全取決於它是如何在封面下處理的,標準實際上並未授權(標準傾向於更多地關注關於行爲而不是內部)。

可能是是:在堆棧上,在特定的內存位置,在寄存器等等。所有你必須關心的是它的行爲,基本上你如何使用它來訪問對象。

什麼this指向是對象本身,它通常分配爲new動態分配,或在堆棧上。

1

這個指針被分配到你的類函數(或者有時候是一個寄存器)的堆棧中。

然而,這不太可能是您實際詢問的問題。

+1

其實這似乎正是被問到的問題。儘管如此,恐怕答案太模糊了。 –

0

該指針位於對象本身*中。 排序的。它是對象的內存位置。

如果對象位於堆棧上,則此指針位於堆棧上。

如果對象位於堆上,則此指針位於堆上。

底線,沒什麼需要擔心的。

* [更新]讓我退一步/澄清/更正我的答案。該物理指針不在該對象中。

我會得出結論,這個指針是由編譯器派生出來的,它只是存儲在符號表中的對象的地址。在語義上,它在對象內部,但這不是OP所要求的。

這是堆棧上3個變量的內存佈局。中間一個是一個對象。你可以看到它認爲它是一個變量,沒有別的:

enter image description here

+0

那麼,如果我們計算對象的大小,那麼我們應該得到這個指針的實際大小+大小,即額外4個字節..但是這並非如此 – nilesh

+0

我不認爲它出現在sizeof運算符中。根據編譯器的不同,指針的大小可能不同。如果你有虛函數,還有一個函數指針的隱藏表,它不會在sizeof運算符中出現。 –

+0

但我們可以看到額外的4字節分配給虛擬指針,它指向vtable – nilesh