Каков размер (variable = & anotherVar) - PullRequest
1 голос
/ 24 марта 2012

Каков размер (переменная = & anotherVar)

int y = 10; // the size of y is 4 bytes
int & x = y; // what is the size of x that receives the address of y

Ответы [ 5 ]

4 голосов
/ 24 марта 2012

Не определено, требует ли ссылка хранения (C ++ 11 8.3.2.4)

Для случая

int y = 10;
int & x = y;

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

Если ссылка используется в качестве параметра функции или в классе / структуре, то она, вероятно, будетбыть реализован внутри как указатель, поэтому размер будет sizeof(int*).Конечно, если функция со ссылочными параметрами является встроенной, то дополнительная память не потребуется.

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

Предполагая, что вы говорите о физическом размере ссылочного типа int&, он почти наверняка будет такого же размера, что и тип указателя int*, который обычно составляет 4 или 8 байт в современных архитектурах (32- или64-разрядные процессоры).

Если вы хотите измерить его на своем компиляторе, используйте это:

struct Test { int& x; }
printf("%d\n", (int)sizeof(Test));

Также обратите внимание, что технически ваш компилятор может дополнить структуру Test идаст вам неправильный ответ, но это, вероятно, будет работать нормально.

Обратите внимание, что sizeof(int&) - это то же самое, что и sizeof(int), и не говорит точно, сколько места будет использовать int&, если оноявляется членом данных.

0 голосов
/ 24 марта 2012

Простой тест должен устранить любую путаницу:

#include <iostream>

using namespace std;

void f(char &r)
{
  cout << sizeof(r) << endl;
  cout << sizeof(&r) << endl;
}

int main()
{
  char x = 0;
  char &y = x;
  cout << sizeof(y) << endl;
  cout << sizeof(&y) << endl;
  f(x);
  return 0;
}

Вывод (скомпилирован как 32-разрядная программа x86):

1
4
1
4
0 голосов
/ 24 марта 2012

Так что я думаю, что вы путаете указатели и ссылки.

Вы спрашиваете, что такое (x = & y)?

Но тогда ваш пример - ссылка (X & x = y).

Я думаю, вы имеете в виду размер указателя?Это зависит от архитектуры.Чтобы узнать, что это за тип вашей целевой цели:

cout << sizeof(void*)
0 голосов
/ 24 марта 2012

Результатом применения sizeof к ссылке или ссылочному типу является размер ссылочного типа.(C ++ 03, 5.3.3.2)

Если ваш int равен 4 байта (он не должен быть), то и ссылка тоже.

...