我在想,編譯器能做到這些場景嗎?會不會共享呼叫者/被呼叫者棧幀的一部分?
第一我們定義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();
這將是呼叫者佔空比來複制共享部分,其中該指針告訴的內容。
你也許在談論RVO? – PlasmaHH
@PlasmaHH絕對沒有 – Pooria