Aunque sizeof(ref_var)
devuelve el tamaño del objeto al que se hace referencia, todavía se necesita espacio para almacenar una referencia en una estructura, y en implementaciones comunes el espacio asignado para almacenar una referencia es el mismo que el espacio asignado para almacenar una puntero. Eso no puede ser requerido por la norma, pero este código, al menos, muestra el efecto:
#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;
}
No pretendo que es 'gran código' - no es - pero demuestra un punto. Compilado en el modo (64-bit) MacOS X 10.6.4 con compilador el C++ de la colección de compiladores de GNU (GCC 4.5.1) en forma predeterminada, la salida es:
1
16
24
Cuando se compila en el modo de 32 bits, la salida es:
1
16
20
la primera línea de la salida demuestra que 'sizeof(ref_var)
' en efecto, devolver el tamaño del objeto referenciado. La segunda línea muestra que una estructura sin referencia tiene un tamaño de 16 bytes.La tercera línea muestra que una estructura muy similar con una referencia incrustada en un límite de 8 bytes (en un sistema donde sizeof(int) == 4
) es 8 bytes más grande que la estructura más simple en una compilación de 64 bits y 4 bytes más grande en un 32- compilación de bits. Por deducción, la parte de referencia de la estructura ocupa más de 4 bytes y no más de 8 bytes en la compilación de 64 bits, y ocupa no más de 4 bytes en la compilación de 32 bits. Esto sugiere que (en al menos una implementación popular de C++) que una referencia en una estructura ocupa la misma cantidad de espacio que un puntero, como se afirma en algunas de las otras respuestas.
Por lo tanto, puede depender de la implementación, pero el comentario de que una referencia ocupa el mismo espacio que un puntero es válido en al menos una implementación (bastante utilizada).
¿Su pregunta '" Referencias requieren almacenamiento "'? Por favor sea más preciso. –
Sí, no estoy muy seguro de qué es exactamente lo que estás preguntando. ¿Podrías aclarar? –
@Prasoon: ¿Correcto, y más importante aún, cómo encaja todo en el entorno de 64 bits? Si char & takes 8bytes y char toma 4, también podría hacer todo por valor si la memoria es una prima en mi situación. – Fanatic23