Хотя sizeof(ref_var)
возвращает размер ссылочного объекта, пространство все еще требуется для хранения ссылки, например, в структуре, и в общих реализациях пространство, выделенное для хранения ссылки, такое же, как пространство, выделенное для хранения указатель Это может не требоваться стандартом, но этот код по крайней мере показывает эффект:
#include <iostream>
using namespace std;
char c1 = 'a';
char &c2 = c1;
struct x
{
char c1;
char c2;
char c3;
char c4;
int i4a;
char &r1;
int i4b;
int i4c;
x() : r1(c1) { }
};
struct y
{
char c1;
char c2;
char c3;
char c4;
int i4a;
int i4b;
int i4c;
};
int main()
{
cout << sizeof(c2) << endl;
cout << sizeof(y) << endl;
cout << sizeof(x) << endl;
return 0;
}
Я не претендую на то, что это «отличный код» - это не так - но он демонстрирует точку зрения. Скомпилированный в MacOS X 10.6.4 с помощью компилятора C ++ из коллекции компиляторов GNU (GCC 4.5.1) в режиме по умолчанию (64-разрядный), вывод:
1
16
24
При компиляции в 32-битном режиме вывод будет:
1
16
20
Первая строка вывода показывает, что 'sizeof(ref_var)
' действительно возвращает размер ссылочного объекта. Вторая строка показывает, что структура без ссылки имеет размер 16 байт. Третья строка показывает, что очень похожая структура со ссылкой, встроенной в нее на 8-байтовой границе (в системе, где sizeof(int) == 4
), на 8 байт больше, чем более простая структура при 64-битной компиляции, и на 4 байта больше при 32-битная компиляция. Вывод: эталонная часть структуры занимает более 4 байтов и не более 8 байтов при 64-битной компиляции и занимает не более 4 байтов при 32-битной компиляции. Это говорит о том, что (по крайней мере, в одной популярной реализации C ++) ссылка в структуре занимает столько же места, сколько указатель - как утверждается в некоторых других ответах.
Таким образом, это может зависеть от реализации, но комментарий о том, что ссылка занимает то же пространство, что и указатель, остается верным как минимум в одной (довольно широко используемой) реализации.