tour plusplus plus oficial for documentacion c++ c++11 language-lawyer

c++ - plusplus - ¿La optimización de clase base vacía ahora es una optimización obligatoria(al menos para las clases de diseño estándar)?



c++ website (1)

De acuerdo con C ++ 11 9.1 / 7 (borrador n3376) , 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 de base virtual (10.1),

  • tiene el mismo control de acceso (Cláusula 11) para todos los miembros de datos no estáticos,

  • no tiene clases de base de diseño no estándar,

  • o 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.

se deduce que una clase vacía es una clase de diseño estándar ; y que otra clase con una clase vacía como base también es una clase de diseño estándar siempre que el primer miembro de datos no estáticos de dicha clase no sea del mismo tipo que la base.

Además, 9.2 / 19 establece que:

Un puntero a un objeto de estructura de diseño estándar, convertido adecuadamente usando un 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 diseño estándar, pero no al principio, según sea necesario para lograr la alineación adecuada. "Nota final"

Esto parece implicar que la Optimización de clase base vacía ahora es una optimización obligatoria, al menos para las clases de diseño estándar . Mi punto es que si la optimización de la base vacía no es obligatoria, entonces el diseño de una clase de diseño estándar no sería estándar, sino que dependería de si la implementación implementa o no dicha optimización. ¿Mi razonamiento es correcto, o me falta algo?


Sí, tiene razón, eso se señaló en las propuestas "PODs revisited": http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2007/n2342.htm#ABI

Los documentos del compilador de Embarcadero también lo indican: http://docwiki.embarcadero.com/RADStudio/en/Is_standard_layout

Otro punto clave es [class.mem] / 16

Dos tipos de estructura de diseño estándar (Cláusula 9) son compatibles con el diseño si tienen el mismo número de miembros de datos no estáticos y los miembros de datos no estáticos correspondientes (en orden de declaración) tienen tipos compatibles con el diseño (3.9).

Tenga en cuenta que solo los miembros de datos afectan la compatibilidad del diseño, no las clases base, por lo que estas dos clases de diseño estándar son compatibles con el diseño:

struct empty { }; struct stdlayout1 : empty { int i; }; struct stdlayout2 { int j; };