2012-05-04 12 views
8

En una máquina de 32 bits siempre obtengo el sizeof de una referencia de 4 bytes, incluso si es una referencia a un doble, entonces, ¿qué almacena realmente en estos 4 bytes?por qué el tamaño de referencia es siempre de 4 bytes - C++

EDIT:

class A{ 
public: 
    double& a; 
}; 

int main(){ 
    cout << sizeof(A) << endl; // this will print out 4 
} 
+8

No se puede obtener el tamaño de una referencia, porque una referencia no es un objeto. Por favor muéstranos con qué código estás probando. –

+0

¿por qué los votos negativos? – AlexDan

+3

Porque su pregunta no tiene sentido. Como dice @ R.MartinhoFernandes, no se puede obtener el tamaño de una referencia. Entonces, a menos que publiques un código que muestre lo que realmente estás * haciendo *, no tenemos ni idea de qué preguntas ni cómo responderlo – jalf

Respuesta

30

El estándar es bastante claro en sizeof (C++ 11, 5.3.3/4):

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

Así que si realmente está tomando sizeof(double&), el compilador le está diciendo que es sizeof(double) 4.

Actualización: Por lo tanto, lo que realmente está haciendo es aplicar sizeof a un tipo de clase. En ese caso,

cuando se aplica a una clase, el resultado es el número de bytes en un objeto de esa clase [...]

por lo que sabemos que la presencia de la referencia dentro de A hace que ocupe 4 bytes. Esto se debe a que, aunque el estándar no ordena cómo se implementarán las referencias, el compilador todavía tiene que implementarlas de alguna manera. Esto de alguna manera puede ser muy diferente dependiendo del contexto, pero para un miembro de referencia de un tipo de clase, el único enfoque que tiene sentido es el de esconderse en un double* detrás de su espalda y llamarlo double& en su cara.

Por lo tanto, si su arquitectura es de 32 bits (en la que los punteros tienen una longitud de 4 bytes) eso explicaría el resultado.

Solo tenga en cuenta que el concepto de una referencia no está vinculado a ninguna implementación específica. El estándar permite al compilador implementar referencias de la manera que quiera.

19

No puede, y no lo es.

Una referencia de C++ es no un puntero. Es un alias de un objeto. Algunas veces, el compilador elige implementar esto usando un puntero. Pero a menudo, lo implementa por sin hacer nada en absoluto. Simplemente genere código que se refiera directamente al objeto original.

En cualquier caso, sizeof aplicado a un tipo de referencia no le da el tamaño de una referencia. Entonces, no está claro lo que estás haciendo, lo que hace que sea imposible explicar lo que está sucediendo.

Editar

Ahora que usted ha mostrado algo de código, podemos responder a la pregunta: ¿

usted está tomando el tamaño de una clase que contiene una referencia.Como dije anteriormente, una referencia no es un puntero, pero cuando es necesario, el compilador puede recurrir a un puntero para representarlo. Cuando se crea una clase que contiene una referencia, la única forma (sana) que el compilador puede implementar es mediante la definición de una clase que contiene la dirección de un objeto. En sistemas de 32 bits, las direcciones son de 32 bits, o 4 bytes, de ancho. Entonces sizeof una clase de este tipo (típicamente) será 4.

+0

Incorrecto en muchos niveles. "A veces, el compilador decide implementar esto usando un puntero. Pero a menudo, lo implementa sin hacer nada en absoluto". Eso no es diferente de un entero, o cualquier otra cosa. A menos que acepte que 'int i = 1;' no declara nada (al menos si no cambia 'i' later'), no puede decir que una referencia no es nada en absoluto. – jpalecek

+14

Claro que puedo. Si haces algo como esto: 'int i = 0; int & r = i', entonces los compiladores normalmente * no * generan código para poner un puntero a 'i' en la pila. En cambio, las operaciones subsiguientes en 'r' (digamos,' r ++ ') simplemente emitirán el * mismo * mismo código como si hubieras escrito' i ++ 'Una referencia es solo un alias. – jalf

+0

Una referencia es exactamente un puntero. Cualquier optimización que un compilador pueda hacer con 'int i; int & r = i', puede hacer con 'int i; int * r = & i'. Cualquier optimización que no puede hacer con un puntero, no puede hacer con una referencia. El problema del alias del puntero también está presente con referencias completas. –

Cuestiones relacionadas