ejemplos - C++ POD estructura struct? ¿Hay alguna garantía sobre el diseño de memoria de los miembros derivados?
estructuras en c++ pdf (3)
Digamos, tengo una struct RGB
y quiero crear la struct RGBA
, que hereda RGB
:
struct RGB {
unsigned char r;
unsigned char g;
unsigned char b;
};
struct RGBA: RGB {
unsigned char a;
};
Ambos se utilizarán para leer datos de imagen sin comprimir:
RGBA *pixel=static_cast<RGBA *>(image->uncompressed_data);
Pregunta: ¿Es esto seguro, con respecto al diseño de memoria de struct RGBA
? ¿Alguien garantiza, que:
-
unsigned char a
viene después de laRGB struct
(no antes) - ¿No hay relleno entre la
struct RGB
y el parámetro de lastruct RGBA
?
¿Ayudará #pragma pack
aquí? Se trata de diseño de memoria durante la herencia.
Es fácil verificar el relleno: sizeof(RGB)
impresión sizeof(RGB)
y sizeof(RGBA)
. Si no son 3 respectivos 4, entonces las estructuras están acolchadas, y necesita eliminarlo.
En cuanto a si el miembro a
viene después de b
, puede usar offsetof
para verificar la compensación de cada miembro. Si el desplazamiento para a
es uno mayor que el desplazamiento de b
, a
viene directamente después de b
.
No, el diseño no está garantizado. Las únicas garantías son para las clases de diseño estándar; y una de las condiciones de tal clase es que
o bien 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
En otras palabras, todos los miembros de datos deben estar en la misma clase, no en más de uno.
NO hay garantías sobre el diseño de memoria de los miembros derivados y el reparto NO es seguro.
Como tienes herencia, también podría haber relleno, esto NO es trivial.
§ 9 clases
1 Una estructura POD109 es una clase que es a la vez una clase trivial y una clase de diseño estándar , y no tiene miembros de datos no estáticos de tipo estructura no POD, unión no POD (o matriz de tales tipos). De manera similar, una unión POD es una unión que es a la vez una clase trivial y una clase de diseño estándar, y no tiene
También std::is_pod<RGBA>
no es un POD
std::cout << std::boolalpha;
std::cout << std::is_pod<RGBA>::value << ''/n'';
el resultado es falso ver demostración en vivo