私は疑問に思っていましたが、これらのシナリオはコンパイラで実行できるのでしょうか?
最初に SomeDataType を次のように定義します。
struct SomeDataType{
public:
int a;
int b;
int c;
};
シナリオ #1 _次のような参照パラメーターを持つ呼び出し先関数について:
void doSomething(SomeDataType & input){
...
}
関数がインラインではなく、呼び出し元関数のスコープ内の変数のみがプログラム内のこの関数に渡されると仮定し、参照が必ずしもポインターではないという事実に関して、入力引数が配置されるメモリの部分はスタックフレーム間で共有されますこれにより、「doSomething」は、そのスタックの開始アドレスを決定するベース ポインターにオフセットを追加することによって、そのローカル スコープ内の任意のローカル変数をアドレス指定するのと同じ方法で、そのパラメーターをアドレス指定できます。フレーム。
シナリオ #2 _これは私にはありそうにないように思えますが、とにかく; タイプ「SomeDataType」の構造体を返す呼び出し先関数に関して:
SomeDataType doSomething(){
SomeDataType someStruct;
...
return someStruct;
};
構造体「someStruct」が存在するメモリの部分は、任意の呼び出し元のスタック フレームと「doSomething」呼び出し先関数のスタック フレームの間で共有されるため、呼び出し元関数の次のステートメントを検討してください。
SomeDataType TheStruct=doSomething();
その呼び出し元のスコープで「TheStruct」を使用すると、呼び出し先のスコープ内の「SomeStruct」が存在するメモリの同じ部分を使用することになり、基本的に呼び出し先関数は「someStruct」をどこにもコピーしません。宛先が呼び出し元スコープ内の構造体ではないことを示す、呼び出し元関数内の次のようなステートメントでした。
*pntrToSomewhere=doSomething();
その共有部分の内容をそのポインターが示す場所にコピーするのは呼び出し元の義務です。