¿Las referencias (en C ++) se almacenan en la memoria (como punteros) o no?

Respuesta corta: el estándar no especifica.

Respuesta larga: en algunas circunstancias, la mayoría de los compiladores (¿todos?) Representarán una referencia (por ejemplo, como un parámetro para una función) muy similar a un puntero debajo del capó, menos la necesidad de inyectar código especial para manejar cosas como conversiones con nulo. En otras circunstancias, se puede describir una referencia con un desplazamiento de la pila, o por cualquier otro mecanismo que el compilador pueda encontrar en el momento de la compilación. Si el objeto referenciado es accesible localmente, el compilador puede tratarlo como un alias directo, como si la variable de referencia no existiera en absoluto, y generar un código que sea idéntico a reemplazar la referencia con la variable local a la que se refiere. Incluso si la variable no es estrictamente local (porque, por ejemplo, es devuelta por una llamada de función en otra variable), si se puede alinear a un desplazamiento en la variable propietaria, la referencia puede compilarse en esa operación de desplazamiento.

Conceptualmente, un puntero es una variable como cualquier otra, simplemente almacena una referencia a otra variable. Puede programar C y C ++ con este concepto y no se equivocará (esto incluye la mayoría de los otros lenguajes, incluidos los que afirman no tener punteros, pero realmente los tienen, como C # y Java).

La realidad es más compleja. Puede haber muchas razones cuando el compilador en realidad no genera una ubicación de memoria real para almacenar el puntero en otra ubicación de memoria. Aquí hay un par de ejemplos:

  • Si el puntero se usa dentro de una pequeña cantidad de código (un bucle pequeño, por ejemplo), simplemente puede convertirse en un registro de procesador.
  • Si el puntero se establece en una referencia de variable y el optimizador ve que nunca se cambia, puede intercambiarse con la variable real.

Estoy seguro de que hay muchos otros; ninguno viene a la mente. La conclusión es que no necesita comprender nada de eso para usar punteros. Piense en ello como una variable más y siga adelante.

Tenga en cuenta que la conversación anterior también puede aplicarse a las variables regulares, muchas veces el optimizador las elimina por completo para otra metodología.

Una referencia es otro nombre para la misma variable. Por ejemplo, “Charlie Brown” también se llama “Chuck”: una referencia es solo otro nombre para el mismo objeto.

La “última persona en la fila del almuerzo” es un puntero y puede cambiar o no señalar nada.

Otra analogía es del sistema de archivos UNIX: una referencia es un enlace duro, un puntero es un enlace suave.

No se especifica cómo se almacenan, pero un puntero en el que puede confiar puede tener almacenamiento