c++ reference language-lawyer memory-layout storage-duration

c++ - ¿Una referencia tiene una ubicación de almacenamiento?



reference language-lawyer (2)

La última especificación de C ++ 20 (§ 9.2.3.3) y al menos desde el estado de especificación preliminar de C ++ 2005 :

No se especifica si una referencia requiere o no almacenamiento

La implementación real es caso por caso. Obviamente, si una clase tiene una variable de un solo miembro que es una referencia, deberá ser almacenada en algún lugar. Pero el compilador tiene margen de maniobra cuando se usa una referencia únicamente como un alias, como usted lo pone.

¿Una referencia tiene una ubicación de almacenamiento o es solo un alias para otra ubicación? ¿Esto difiere según la revisión de C ++ o es consistente con todas las versiones de C ++? Y si una referencia tiene una ubicación de almacenamiento, ¿entonces solo permite semántica de valor en un tipo de puntero?

¿Cómo funcionaría una referencia cuando la usas como tal?

struct aStruct{ int aVariable; aClass& aReferencetoaClass; };

¿Ocupa espacio o es un alias?


La mayoría de los compiladores, al menos para cualquier estándar de C ++ hasta C ++ 17, implementarán efectivamente una referencia como puntero, a menos que estén optimizados.

En particular, dentro de una struct , tomará el tamaño de un puntero (más alineación / relleno, etc.).

Por lo tanto, esto se mantendrá en la mayoría de los entornos:

struct S { char & a; }; static_assert(sizeof(S) == sizeof(void *));