3

スタックベースの参照とは? オブジェクトのメンバーである参照とどう違うのですか? 規格はこれらについて話していますか?

Herb Sutter によって書かれた記事でこれに出くわしました。

Q1: 次のコードは合法的な C++ ですか?

// Example 1

string f() { return "abc"; }

void g() {
const string& s = f();
  cout << s << endl;    // can we still use the "temporary" object?
}

A1: はい。これは C++ の機能です。コードは有効であり、表示どおりに動作します。

通常、一時オブジェクトは、それが現れる完全な式の終わりまでしか存続しません。ただし、C++ では、一時オブジェクトをスタック上の const への参照にバインドすると、一時オブジェクトの有効期間が参照自体の有効期間まで長くなるため、一般的なダングリング参照エラーを回避できるように意図的に指定されています。上記の例では、 f() によって返されたテンポラリは、右中括弧まで存続します。(これはスタックベースの参照にのみ適用されることに注意してください。オブジェクトのメンバーである参照には機能しません。 )

4

4 に答える 4

5

特定のコンテキストでは、スタックベースの参照は、スタック上の自動オブジェクトである参照を意味します。

つまり、

// ...
{
  // ...
  const foo& x = some_foo;
  // ...
}
// ...

xはスタックベースのオブジェクトですがthe_foo

class bar {
  // ...
  foo& the_foo;
  // ...
};

そうではありません。

于 2011-01-21T18:29:44.150 に答える
2

スタックベースの参照は、関数呼び出しのパラメーターまたはブロック内のローカルの非静的変数である参照です。他のすべての参照は、スタック ベースではありません。

int foo;
static int &fooref = foo;  // Not stack based.

class A {
 public:
   A(int &z) : x(z) {}  // z is stack based, x isn't.
   int &x;  // Not stack based.
};

void joe(int &i) { // i is stack based.
   int &k = i;  // k is stack based.
   static int &j = i;  // j is not stack base and this will likely result in a bad error later.
   A a(k);  // a is stack based, but A.x still isn't.
}
于 2011-01-21T18:42:34.857 に答える
1

スタックベースの参照は、ヒープベースの参照の代わりになります。一般に、戻り値とローカル変数値は、現在実行中の関数のシーケンスが何であるかを格納する場所である「呼び出しスタック」に割り当てられます。

一般に、関数を呼び出すと、「スタックフレーム」がスタックにドロップされます。これには、すべてのローカル変数、引数、および関数の戻り値のための十分なスペースが含まれます。その関数にある間、そのスタックフレームはそのすべての値とともに存続します。関数が終了すると、通常、スタックフレームは破棄され、次のレベルに戻ります。

この場合、「abc」はf()のスタックフレームに入りますが、c ++は、親のスタックフレームのすぐ隣に割り当てるのに十分賢いです。f()がスタックからポップされると、g()のスタックフレーム(f()と呼ばれるg()が値「abc」にぶら下がるように調整されるため、スタック内のf()のすぐ下にあります)。

これは、スタックに割り当てられたオブジェクトについて説明しています。別の方法は、永続的なヒープ内のオブジェクトです。ヒープ上のオブジェクトは、「new」と「delete」を使用して管理され、ポインターまたはヒープ参照によって所定の位置に保持されます。関数を終了すると、スタックオブジェクトは自動的に解放されます。ヒープ上のオブジェクトは手動で解放する必要があります。

于 2011-01-21T18:33:08.837 に答える
0

スタックベースの参照は、単にスタック上に存在する参照です。

int main()
{
    int a = 3;
    int &b = a;  // b is a stack-based reference
    ...
}
于 2011-01-21T18:30:34.980 に答える