Что такое ссылка на основе стека? - PullRequest
2 голосов
/ 21 января 2011

Что такое стековые ссылки? Чем они отличаются от ссылок, которые являются членами объектов? Стандарт говорит об этом?

Я сталкивался с этим в статье , написанной Хербом Саттером:

В1: Является ли следующий код допустимым для 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 голосов
/ 21 января 2011

В данном контексте ссылки на основе стека означают ссылку, которая является автоматическим объектом в стеке.

То есть в

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

x - это объект на основе стека, а the_foo в

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

- нет.

2 голосов
/ 21 января 2011

Ссылка на основе стека - это ссылка, являющаяся параметром вызова функции или локальной нестатической переменной внутри блока.Все остальные ссылки не основаны на стеке.

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.
}
1 голос
/ 21 января 2011

Ссылка на основе стека является альтернативой ссылке на основе кучи. Как правило, возвращаемые значения и значения локальных переменных размещаются в «стеке вызовов», в котором хранится последовательность выполняемых в данный момент функций.

Как правило, когда вы вызываете функцию, в стек помещается «кадр стека», включая достаточно места для всех локальных переменных, аргументов и возвращаемого значения функции. Находясь в этой функции, этот стек стека остается живым вместе со всеми его значениями; когда функция завершается, кадр стека обычно отбрасывается, и вы возвращаетесь на следующий уровень вверх.

В этом случае «abc» входит в кадр стека для f (), но c ++ достаточно умен, чтобы разместить его прямо рядом с кадром стека родителя; когда f () извлекается из стека, кадр стека для g () (который находится непосредственно ниже f () в стеке, так как g () с именем f ()) настраивается так, чтобы зависать со значением "abc".

Это описывает объекты, расположенные в стеке; альтернатива - объекты в куче, которые являются постоянными. Объекты в куче управляются с использованием 'new' и 'delete' и удерживаются на месте указателями или ссылками кучи. Стек объектов автоматически освободится, когда вы закончите с функцией; объекты в куче должны быть освобождены вручную.

0 голосов
/ 21 января 2011

Ссылка на основе стека - это просто ссылка, которая находится в стеке.

int main()
{
    int a = 3;
    int &b = a;  // b is a stack-based reference
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...