ダイナミックメモリ(新規)にオブジェクトがあり、その関数の1つにオブジェクトがあるとします。
int Obj1::Add(int a, int b)
{
int c = a + b;
return c;
}
c(およびaとb ...)はスタックにありますか?または私のオブジェクトとのダイナミックメモリ内。ただ好奇心が強い:)ありがとう
C ++標準では、「スタック」または「ヒープ」という用語について明示的に言及されていません。代わりに、特定の「ストレージ期間」の観点から物事を実装するには、C++コンパイラが必要です。
しかし、今日のプロセッサとコンパイラの実用的な目的では、通常、a / b/cがスタックまたはレジスタにあると想定できます。
それらはすべてスタックにあります。a
とb
パラメータが渡されるため、元のファイルがヒープ内にある場合でも、スタックにコピーが作成されます。参照で渡す場合、実際に送信されるもの(「内部」)は元のオブジェクトへのポインターであるため、別の問題になる可能性があります。
の場合c
、これはローカル変数であるため、スタックにもあります。
もちろん、これは、実装でスタックが使用されていることを前提としており、最適化によってスタックがレジスタに格納されているだけではありません。それは本当に完全に実装次第です。
それは本当にコンパイラ次第です。Sparcでは、3つすべてがレジスターに含まれ、これが最も頻繁なケースになると思います。Intel 32ビット(または過去にさかのぼる場合は16ビット)でのみ、スタックに存在しますa
。b
どれも多くのものに関連していません。あなたの質問の要点に関して(私は思う):それらのどれもがによって参照されるオブジェクトの一部にはならないでしょうthis
。ただし、コンパイラーは物事を整理しますが、3つの変数はオブジェクト以外の場所にあります。オブジェクト自体がスタック上にあり、引数などもスタック上にあるIntelアーキテクチャーを使用している場合でも、オブジェクトと変数はスタック上の異なる場所にあります。
a
、b
およびc
スタック上にあります(またはレジスター内にある可能性があります)。
それらはすべてスタック上にあります。ただし、コピーが作成されるため、cを呼び出し元に返すことは安全です。