2

我在想,編譯器能做到這些場景嗎?會不會共享呼叫者/被呼叫者棧幀的一部分?

第一我們定義SomeDataType爲:

struct SomeDataType{ 
public: 
int a; 
int b; 
int c; 
}; 

場景#1 _regarding具有參考參數這樣的被調用函數:在

void doSomething(SomeDataType & input){ 
... 
} 

假設功能沒有內聯並且僅變量調用者函數的作用域在程序中傳遞給該函數,並且關於引用不一定是指針的事實,放置輸入參數的內存部分在堆棧fram之間共享e「doSomething」被調用者函數的任何調用者函數和堆棧框架,以便「doSomething」可以解決該參數,就像它在本地範圍內尋址任何局部變量的方式那樣,通過將偏移量添加到確定其起始地址的基指針堆棧框架。

情景#2 _這對我來說似乎更不可能,但無論如何,關於返回類型的「SomeDataType」的結構的被調用函數:

SomeDataType doSomething(){ 
SomeDataType someStruct; 
... 
return someStruct; 
}; 

的存儲器,其中所述結構「someStruct」駐留的「doSomething的」調用函數這樣的任何呼叫者和堆棧幀的堆棧幀之間共享的部分考慮到在一個調用函數的聲明如下:使用使用相同的內存部分,其中「SomeStruct」在被叫方的範圍所在的含義基本上被調用函數沒有按「TheStruct」結果

SomeDataType TheStruct=doSomething(); 

在調用者的範圍不要在任何地方複製「someStruct」,即使有必要進行復制,比如有時會出現像b這樣的陳述elow在指示目的地呼叫方的功能並不在呼叫者範圍的結構:

*pntrToSomewhere=doSomething(); 

這將是呼叫者佔空比來複制共享部分,其中該指針告訴的內容。

+0

你也許在談論RVO? – PlasmaHH

+0

@PlasmaHH絕對沒有 – Pooria

回答

0

如果您在調用函數(調用者)中傳遞引用(或指針)到局部變量,那麼它將位於調用者堆棧幀上。請注意,我並不知道任何架構,如果您擡起地毯並查看它是如何在漂亮的表面上工作的,那麼引用實際上並不是指針。該標準並不要求這樣做,但至少在大多數體系結構中它是如何實現的 - 我實際上有興趣瞭解如何實現它 - 但我沒有花太多時間考慮它。

具有structclass返回類型的函數的典型行爲是,它通過一個「額外」的說法指向一個臨時的空間來存儲返回類型,如:

T myfunc(int x, int y) 

... 

void foo() 
{ 
    ... 
    T x = myfunc(2, 18); 
    ... 
} 

將出現相同(隱藏的說法並不一定是第一個參數 - 但它幾乎肯定第一或最後一個):

void myfunc(T& hidden, int x, int y) 

void foo() 
{ 
    ... 
    T x; 
    myfunc(x, 2, 18); 
    ... 
} 

它是不是真的那麼通過StackFrame是共享的,不亞於「我們通過指針是在...中或更早的調用者的堆棧幀。

所以,是的,當然可以從當前被調用者訪問先前的調用者棧幀。

+0

就我所知,引用不是指針,當函數被內聯時,它僅僅是這種情況下的一個別名,它指的是在場景#1中我故意聲明函數沒有內聯來排除這種情況,就像你描述的那種叫做RVO(返回值優化)的機制,但不是我的意思 – Pooria