(Управление памятью в C ++) Если у нас есть int x = 1234 и int & y = x ... тогда какой адрес у в стеке? - PullRequest
4 голосов
/ 05 марта 2012

Мы готовимся к нашему среднесрочному обучению CS во вторник.

Наш профессор разместил в Интернете некоторые учебные материалы, включая следующие:

"Кроме того, вы должны быть в состоянии нарисовать диаграмму памяти, учитывая некоторый код, такой как:"

void foo( int &x )
{
 x = 1000;
}

void bar( int *x )
{
 *x = 1000;
}

void foobar( int x )
{
 x = 1000;
}

int main()
{
   int x = 1234;
   int &y = x;

   int *z = &x;

   int  array_1[5];
   int *array_2[5];

   array_1[0] = 10;
   array_2[0] = (int*)10;
   array_2[1] = &y;

   array_2[2] = &x;

   foo( x );
   foo( y );
   foo( *z );

   bar( &x );
   bar( &y );
   bar( z );

   foobar( x );
   foobar( y );
   foobar( *z );

   return 0;
}

Мы пытаемся пройти по одному шагу за раз, чтобы увидеть, что выделено в стеке, что выделено в куче и какова ценность каждой вещи.

Что мы не понимаем, так это: & y содержит адрес x, но & y = & x ... так какой адрес у? Мол, в стеке нет необходимости держать y ???

Ответы [ 4 ]

8 голосов
/ 05 марта 2012

Короче говоря - нет ложки y. Так что в стеке ничего не будет выделено для y. Это потому, что y в вашем случае является ссылкой.

Ссылка является просто псевдонимом и не имеет адреса. Другими словами - это то же самое, что и x, но названо по-другому. Вот как вы должны думать о ссылках как о программисте на C ++. Фактически, компилятор может использовать адрес объекта для реализации ссылки (т.е. когда вы передаете по ссылке). И даже в этом случае он может храниться только в регистре, поэтому не имеет адреса памяти. Но это детали реализации, о которых вы не должны знать :) Я рекомендую вам ознакомиться с этим C ++ References FAQ .

3 голосов
/ 05 марта 2012

y не является ни объектом, ни функцией, поэтому не имеет адреса.Это ссылка на переменную x, что означает, что всякий раз, когда вы используете y, это как если бы вы использовали x.Обратите внимание, что это вовсе не требует, чтобы y содержал указатель на x.

В функции main, y, вероятно, вообще не существует в сгенерированном исполняемом файле;компилятор может тривиально заменить все случаи использования y, как если бы они были использованием x.

В вашей функции bar (опять же, если предположить, что он действительно существует в сгенерированном исполняемом файле и не является полностью встроенным)x, который является ссылкой, должен где-то существовать, потому что он должен ссылаться на объект вне области действия функции.Такие ссылки обычно реализуются как указатели, но разработчики могут свободно реализовывать ссылки, однако они лучше всего подходят.

1 голос
/ 05 марта 2012

Думайте о ссылках как "просто другое имя для".Другими словами, «y» - это просто другое имя для «x» и, следовательно, не имеет адреса.

0 голосов
/ 30 июня 2016

Относительно int & y = x;Если вы посмотрите на листинг сборки (скомпилированный с -S), вы увидите, что во многих случаях адрес x находится в локальном стеке .... следовательно, вы можете рассматривать этот адрес стека как адрес y.

...