¿Los miembros de clase / estructura siempre se crean en la memoria en el orden en que se declararon?

StackOverflow https://stackoverflow.com/questions/281045

  •  07-07-2019
  •  | 
  •  

Pregunta

Esta es una pregunta que fue provocada por la respuesta de Rob Walker aquí .

Supongamos que declaro una clase / estructura así:

struct
{ 
    char A;
    int B;
    char C;
    int D;
};

¿Es seguro suponer que estos miembros se declararán exactamente en ese orden en la memoria, o esto es algo dependiente del compilador? Lo pregunto porque siempre asumí que el compilador puede hacer lo que quiera con ellos.

Esto lleva a mi siguiente pregunta. Si el ejemplo anterior causa problemas de alineación de memoria, ¿por qué el compilador no puede convertirlo en algo así implícitamente?

struct
{ 
    char A;
    char C;
    int B;
    int D;
};

(Principalmente estoy preguntando sobre C ++, pero también me interesaría escuchar la respuesta de C)

Temas relacionados

¿Fue útil?

Solución

C99 & # 167; 6.7.2.1 cláusula 13 establece:

  

Dentro de un objeto de estructura, el   non-bit - & # 64257; miembros de campo y las unidades en   qué bit - & # 64257; los campos residen tienen direcciones   ese aumento en el orden en que   se declaran.

y continúa diciendo un poco más sobre el relleno y las direcciones. La sección equivalente de C89 es & # 167; 6.5.2.1.

C ++ es un poco más complicado. En los estándares de 1998 y 2003, hay & # 167; 9.2 cláusula 12 (cláusula 15 en C ++ 11):

  

Miembros de datos no estáticos de un   (sin unión) clase declarada sin un   el especificador de acceso intermedio es   asignado para que los miembros posteriores tengan   direcciones superiores dentro de una clase   objeto. El orden de asignación de   miembros de datos no estáticos separados por un   el especificador de acceso no está especificado   (11.1) Alineación de implementación   los requisitos pueden causar dos adyacentes   miembros no asignados   inmediatamente uno después del otro; también podría   requisitos de espacio para gestionar   funciones virtuales (10.3) y virtuales   clases base (10.1).

Otros consejos

Los miembros de datos se organizan en el orden declarado. El compilador es libre de intercalar relleno para organizar la alineación de la memoria que le gusta (y encontrará que muchos compiladores tienen una gran cantidad de opciones de especificación de alineación --- útil si se mezclan bits compilados por diferentes programas).

Consulte también ¿Por qué GCC no optimiza las estructuras? .


Parece que esta respuesta es algo obsoleta para C ++. Aprendes algo cada día. Gracias aib, Nemanja.

Básicamente, puede contar con eso solo para las clases con un diseño estándar . Estrictamente hablando, el diseño estándar es una cosa de C ++ 0x, pero en realidad solo está estandarizando la práctica existente /

No puedo hablar por C ++, pero en C se garantiza que el orden será el mismo orden en memoria que el declarado en la estructura.

Aparte del relleno para la alineación, ningún compilador permite la optimización de la estructura (que yo sepa) para C o C ++. No puedo hablar por las clases de C ++, ya que pueden ser otra bestia por completo.

Considere que su programa está interactuando con el código del sistema / biblioteca en Windows pero desea usar GCC. Tendría que verificar que GCC utilizara un algoritmo de optimización de diseño idéntico para que todas sus estructuras se empaquetaran correctamente antes de enviarlas al código compilado por MS.

Al examinar los temas relacionados a la derecha, miré esta pregunta . Creo que este puede ser un caso interesante al pensar en estos problemas (a menos que sea más común de lo que creo).

Parafraseando, si tiene una estructura en C que se parece a esto:

struct foo{};

y subclase así en C ++ (usando una unidad de compilación separada):

extern "C" foo;
struct bar: public foo{};

Entonces la alineación de la memoria no será necesariamente la misma por las razones aib menciona (incluso entre compiladores del mismo proveedor).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top