2012-04-11 46 views
3

說我有在動態存儲器(新)一個對象,裏面的其中一個功能,它具有C++本地變量在動態,在堆棧上?

int Obj1::Add(int a, int b) 
{ 
    int c = a + b; 
    return c; 
} 

是C(a和b ...)在堆棧上?或與我的對象動態記憶。只是好奇:)謝謝

回答

3

所有這些都將在堆棧中。 ab被傳遞參數,所以即使原始文件在堆中,也會在堆棧上進行復制。如果你通過引用傳遞,它可能是一個不同的問題,因爲實際發送的東西(「引擎蓋下」)將更多地指向原始指針。

對於c,由於它是一個局部變量,所以它也在堆棧中。

這當然假設你的實現,即使使用一個堆棧,並且該優化不僅僅將它們存入寄存器。這完全取決於實施。

+1

'a'和'b'是參數,所以它們可能不會在堆棧上,除非像Intel這樣的寄存器非常差的體系結構。在Sparc或AMD 64位處理器上,它們將在寄存器中。 (和任何體面的優化器,'C'也將在寄存器中。) – 2012-04-11 08:48:57

+1

我可以輕鬆地編寫一個標準的符合實現,將所有參數作爲指針傳遞給動態分配的結構體(不是我看到任何充分的理由這樣做),所以我真的不會說在「任何」情況下它不會堆在一起;) – Voo 2012-04-11 09:48:11

1

a,bc是堆棧(或潛在的寄存器)。

0

它們都在堆疊中。但是,將c返回給調用者仍然是安全的,因爲將會創建副本。

3

在C++標準中沒有明確提及術語「堆棧」或「堆」。取而代之的是C++編譯器來實現一定的「存儲時間」方面的事情:

C++ call stack not in standard?

但實際目的與處理器和今天的編譯器,一般可以假設A/B/C是在堆棧或寄存器中。

3

這真的取決於編譯器。在Sparc上,所有三個都將在寄存器中,我希望這是最常見的情況。只有在英特爾32位(或16位,如果你回去的話)將ab放在堆棧上。

沒有哪個與任何事情有關。關於你的問題的關鍵點(我認爲):他們都不會成爲this引用的對象的一部分。然而,編譯器組織事物,這三個變量將不在對象之中。即使對象本身位於堆棧上,並且您在Intel架構中也存在參數等,但對象和變量將位於堆棧的不同位置。