2009-05-27 9 views
8

¿Puede un compilador de C++ (específicamente g ++) reordenar los elementos internos de una estructura?¿Puede un compilador de C++ reordenar elementos en una estructura

que estoy viendo un comportamiento extraño en el que tengo una estructura que contiene algo como lo siguiente:

Struct SomeStruct{ 
    ... 
    ... 
    long someLong; 
    long someLongArray[25]; 
    unsigned long someUnsignedLong; 
    unsigned long someUnsignedLongArray[8]; 
    unsigned long int someUnsignedLongInt; 
    ... 
    ... 
}; 

Cuando escribo esta salida a un archivo, el orden de someUnsignedLongArray y someLongArray parecen invertirse (es decir, los elementos en someLongArray [] aparecen después de someUnsignedLong y los elementos de someUnsignedLongArray [] aparece después de som eLong). ¿¿Es posible??

Gracias


Actualización: a lo solicitado, estoy escribiendo la estructura utilizando la siguiente:

int fd = open(fspec,O_RDWR|O_CREAT|O_TRUNC,0666); 
int writeRes = write(fd,(char *)&someStruct,sizeof(SomeStruct)); 

Para completar, aquí está la estructura completa:

struct SomeStruct{ 
byte someByte; 
byte someByteArray[6]; 
char someChar; 
char someCharArray[5]; 
char someCharArrayArray[3][5]; 
short someShort; 
signed short someShortArray[2]; 
unsigned short someUnsignedShort; 
unsigned short someUnsignedShortArray[8]; 
int someInt; 
int someIntArray[3]; 
int someIntArrayArrayArrayArray[4][3][2][6]; 
int *pSomeInt; 
unsigned int someUnsignedInt; 
unsigned int someUnsignedIntArray[9]; 
long someLong; 
long someLongArray[25]; 
unsigned long someUnsignedLong; 
unsigned long someUnsignedLongArray[8]; 
unsigned long int someUnsignedLongInt; 
long long someLongLong; 
long long someLongLongArray[5]; 
bool someBool; 
bool someBoolArray[3]; 
unsigned long long someUnsignedLongLong; 
unsigned long long someUnsignedLongLongArray[5]; 
unsigned long long someUnsignedLongLongArrayArray[5][2]; 
unsigned long long int *pSomeUnsignedLongLongInt; 
}; 
+0

¿Cómo se escribe la estructura de un archivo? – tstenner

+0

¿está seguro de que está viendo lo que cree que están viendo? es decir, ¿han escrito patrones de bits únicos en cada elemento y pueden rastrearlos hasta el archivo? ¿También qué paquete de #pragma (si lo hay) está utilizando alrededor de la estructura? –

+0

Quizás esté escribiendo los bytes de la estructura, en lugar de los elementos de la estructura, en el archivo. – pyon

Respuesta

26

Normalmente no puede reordenar elementos, no.

Una excepción es si hay un especificador de acceso separándolos:

struct Foo {  
    A a; 
    B b; 
    C c; 
private: 
    D d; 
    E e; 
    F f; 
}; 

a, b y c están garantizados para ser almacenada en este orden, y d, e y f están garantizados para ser almacenados en orden. Pero no hay garantías sobre dónde se almacenan a, byc en relación a d, e y f.

Otra cosa a tener en cuenta es que el compilador puede insertar tanto relleno como desee, incluso si no se reordena nada.

Aquí es la parte pertinente de la norma:

Sección 9.2.12:

miembros de datos no estáticos de un (no unión) clase declarada sin una intervención acceso especificador se asignaron para que los miembros posteriores tengan direcciones más altas dentro de un objeto de clase . El orden de asignación de miembros de datos estáticos separados por un acceso especificador no se especifica (11.1)"

+0

solo curiosidad si tiene una cita para esto? No digo que estés equivocado, pero sería útil tener una cita. –

+0

Creo que solo los POD no pueden reordenarse dentro de los bloques de especificador de acceso. Los no POD no tienen requisitos de orden en absoluto. Pero ya que usted está buscando para arriba de todos modos por Doug T, y mi copia es todo el camino de arriba, te dejaré comprobar ;-) –

+0

uf, supongo que será mejor que mirar hacia arriba y luego ...;) 9.2 .12 dice "Los miembros de datos no estáticos de una clase (sin unión) declarados sin un intermediario de acceso intermedio se asignan para que los miembros posteriores tengan direcciones más altas dentro de un objeto de clase. no está especificado (11.1) ". @onebyone: Curiosamente, no parece decir nada sobre POD versus no POD. Si estás seguro de eso, te dejaré buscarlo. ;) – jalf

Cuestiones relacionadas