lenguaje - estructuras dev c++
Alineacion de estructuras C/C++ (2)
En c / c ++ (supongo que son los mismos a este respecto), si tengo lo siguiente:
struct S {
T a;
.
.
.
} s;
¿Se garantiza que lo siguiente es cierto?
(void*)&s == (void*)&s.a;
O en otras palabras, ¿existe algún tipo de garantía de que no habrá relleno antes del primer miembro?
En C, sí, son la misma dirección. Simple y directo.
En C ++, no, no son la misma dirección. Las clases base pueden (y sospecho que sí) llegar antes que todos los miembros, y las funciones de miembros virtuales generalmente agregan datos ocultos a la estructura en alguna parte. Aún más confuso, un compilador de C ++ también puede reorganizar los miembros a voluntad, a menos que la clase sea un tipo de diseño estándar (aunque no sé si algún compilador lo hace)
Finalmente, si la estructura de C ++ está compuesta de tipos de diseño estándar , no contiene clases base ni funciones virtuales y todos los miembros tienen la misma visibilidad, y posiblemente otras limitaciones que olvidé, entonces recurre a las reglas C y requiere que el primer miembro estar en la misma dirección que el propio objeto.
§ 9.2 / 7
Una clase de diseño estándar es una clase que:
- no tiene miembros de datos no estáticos de tipo clase de diseño no estándar (o matriz de tales tipos) o referencia,
- no tiene funciones virtuales (10.3) ni clases base virtuales (10.1),
- tiene el mismo control de acceso (Cláusula 11) para todos los miembros de datos no estáticos,
- no tiene clases base de diseño no estándar,
- no tiene miembros de datos no estáticos en la clase más derivada y, como máximo, una clase base con miembros de datos no estáticos, o no tiene clases base con miembros de datos no estáticos, y
- no tiene clases base del mismo tipo que el primer miembro de datos no estáticos.
§ 9.2 / 20
Un puntero a un objeto struct de disposición estándar, adecuadamente convertido usando reinterpret_cast, apunta a su miembro inicial (o si ese miembro es un campo de bits, luego a la unidad en la que reside) y viceversa. [Nota: por lo tanto, podría haber un relleno sin nombre dentro de un objeto de estructura de disposición estándar, pero no al principio, según sea necesario para lograr la alineación adecuada. "Nota final"
Sí lo es.
Se garantiza que no hay relleno antes del primer miembro de la estructura en C y en C ++ (si es un POD).
C cita:
(C11, 6.7.2.1p15) "Puede haber un relleno sin nombre dentro de un objeto de estructura, pero no al principio".
Cita C ++:
(C ++ 11, 9.2p20) "Por lo tanto, podría haber un relleno sin nombre dentro de un objeto struct de disposición estándar, pero no al principio, según sea necesario para lograr la alineación adecuada"