2010-10-14 6 views
6

Tengo el siguiente código, que se ejecuta en Windows de 32 bits, visual-studio.¿Por qué la variable de referencia dentro de la clase siempre toma 4 bytes independientemente del tipo? (en el sistema de 32 bits)

template <class T> 
class Test 
{ 
public: 
T &ref; 
Test(T &x) 
    :ref(x) 
{} 
}; 

int main() 
{ 
cout<<"sizeof Test<int> : "<<sizeof(Test<int>)<<endl; 
cout<<"sizeof Test<double> : "<<sizeof(Test<double>)<<endl; 
cout<<"sizeof Test<char> : "<<sizeof(Test<char>)<<endl; 
} 

salida es:

sizeof Test<int> : 4 
sizeof Test<double> : 4 
sizeof Test<char> : 4 

Compiler dando 4 bytes para la variable de referencia dentro irrespect clase del tipo de referencia. El valor de la variable no se puede almacenar en esos 4 bytes.

¿Qué compilador de información almacenará en esos 4 bytes?

¿está almacenando internamente la dirección del referente? para que la referencia y el referente puedan escribir en la misma ubicación para estar sincronizados entre sí.

¿O está almacenando el nombre del referente en la tabla de símbolos?

Respuesta

7

Aquellos para los bytes son la referencia. Una referencia es solo un puntero interno, y los punteros generalmente usan 4 bytes en un sistema de 32 bits, independientemente de los tipos de datos porque es solo una dirección, no el valor en sí mismo.

+0

Así es. El OP podría intentar cambiar a 64 bits para ver la diferencia. –

0

¿Por qué la variable de referencia dentro de la clase siempre toma 4 bytes independientemente del tipo?

It isn't!

C++ 03 5.3.3

Cuando se aplica a una referencia o un tipo de referencia, el resultado es el tamaño del tipo referenciado.

también 8.3.2 dice

Es no especificado si es o no una referencia requiere almacenamiento.

+0

@Saurav: estoy verificando el tamaño del objeto. La variable de referencia sizeof solo viene igual que el tamaño del referente. – bjskishore123

+1

@ bjskishore123: su suposición de que 'la variable de referencia dentro de la clase siempre toma 4 bytes con independencia del tipo 'es incorrecta, aunque las referencias se implementan como punteros. Rest. '3' bytes en el caso de' Test 'son el compilador insertado [padding bytes] (http://en.wikipedia.org/wiki/Data_structure_alignment). –

+0

@Saurav: Incluso cuando uso doble, muestra 4 bytes solo como el tamaño del objeto. Esa es la confusión. Por favor, compruebe mi salida en cuestión. – bjskishore123

Cuestiones relacionadas