3

ダイナミックメモリ(新規)にオブジェクトがあり、その関数の1つにオブジェクトがあるとします。

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

c(およびaとb ...)はスタックにありますか?または私のオブジェクトとのダイナミックメモリ内。ただ好奇心が強い:)ありがとう

4

5 に答える 5

3

C ++標準では、「スタック」または「ヒープ」という用語について明示的に言及されていません。代わりに、特定の「ストレージ期間」の観点から物事を実装するには、C++コンパイラが必要です。

C ++の呼び出しスタックは標準ではありませんか?

しかし、今日のプロセッサとコンパイラの実用的な目的では、通常、a / b/cがスタックまたはレジスタにあると想定できます。

于 2012-04-11T08:46:55.067 に答える
3

それらはすべてスタックにあります。abパラメータが渡されるため、元のファイルがヒープ内にある場合でも、スタックにコピーが作成されます。参照で渡す場合、実際に送信されるもの(「内部」)は元のオブジェクトへのポインターであるため、別の問題になる可能性があります。

の場合c、これはローカル変数であるため、スタックにもあります。

もちろん、これは、実装でスタックが使用されていることを前提としており、最適化によってスタックがレジスタに格納されているだけではありません。それは本当に完全に実装次第です。

于 2012-04-11T08:37:40.197 に答える
3

それは本当にコンパイラ次第です。Sparcでは、3つすべてがレジスターに含まれ、これが最も頻繁なケースになると思います。Intel 32ビット(または過去にさかのぼる場合は16ビット)でのみ、スタックに存在しますab

どれも多くのものに関連していません。あなたの質問の要点に関して(私は思う):それらのどれもがによって参照されるオブジェクトの一部にはならないでしょうthis。ただし、コンパイラーは物事を整理しますが、3つの変数はオブジェクト以外の場所にあります。オブジェクト自体がスタック上にあり、引数などもスタック上にあるIntelアーキテクチャーを使用している場合でも、オブジェクトと変数はスタック上の異なる場所にあります。

于 2012-04-11T08:53:24.383 に答える
1

abおよびcスタック上にあります(またはレジスター内にある可能性があります)。

于 2012-04-11T08:37:13.347 に答える
0

それらはすべてスタック上にあります。ただし、コピーが作成されるため、cを呼び出し元に返すことは安全です。

于 2012-04-11T08:38:04.287 に答える