Pregunta

Los sistemas exigen que ciertas primitivas estén alineadas con ciertos puntos dentro de la memoria (ints a bytes múltiplos de 4, shorts a bytes múltiplos de 2, etc.).Por supuesto, estos se pueden optimizar para desperdiciar el mínimo espacio en el acolchado.

Mi pregunta es ¿por qué GCC no hace esto automáticamente?¿Falta de alguna manera la heurística más obvia (ordenar las variables desde el requisito de mayor tamaño hasta el más pequeño)?¿Algún código depende del orden físico de sus estructuras (es una buena idea)?

Solo pregunto porque GCC está súper optimizado en muchos sentidos, pero no en este, y creo que debe haber alguna explicación relativamente interesante (de la cual no me doy cuenta).

¿Fue útil?

Solución

gcc no reordena los elementos de una estructura, porque eso violaría el estándar C.La sección 6.7.2.1 de la norma C99 establece:

Dentro de un objeto de estructura, los miembros del campo no bit y las unidades en las que residen los campos de bits tienen direcciones que aumentan en el orden en que se declaran.

Otros consejos

Las estructuras se utilizan con frecuencia como representaciones del orden de empaquetado de formatos de archivos binarios y protocolos de red.Esto se rompería si se hiciera así.Además, diferentes compiladores optimizarían las cosas de manera diferente y sería imposible vincular el código de ambos.Esto simplemente no es factible.

GCC es más inteligente que la mayoría de nosotros a la hora de producir código de máquina a partir de nuestro código fuente;sin embargo, me estremezco si fue más inteligente que nosotros al reorganizar nuestras estructuras, ya que son datos que, por ejemplo,se puede escribir en un archivo.Una estructura que comienza con 4 caracteres y luego tiene un entero de 4 bytes sería inútil si se lee en otro sistema donde GCC decidió que debería reorganizar los miembros de la estructura.

gcc SVN tiene una optimización de reorganización de estructura (-fipa-struct-reorg), pero requiere un análisis de todo el programa y no es muy poderoso en este momento.

Los compiladores de C no empaquetan estructuras automáticamente precisamente porque de problemas de alineación como usted menciona.Los accesos que no están en los límites de las palabras (32 bits en la mayoría de las CPU) conllevan una gran penalización en x86 y provocan trampas fatales en las arquitecturas RISC.

No digo que sea una buena idea, pero ciertamente puedes escribir código que dependa del orden de los miembros de una estructura.Por ejemplo, como truco, a menudo las personas lanzan un puntero a una estructura como el tipo de un determinado campo al que desean acceder y luego usan la aritmética de punteros para llegar allí.Para mí, esta es una idea bastante peligrosa, pero la he visto utilizada, especialmente en C++, para forzar que una variable que ha sido declarada privada sea accesible públicamente cuando está en una clase de una biblioteca de terceros y no está encapsulada públicamente.Reordenar a los miembros rompería eso por completo.

Es posible que desee probar la última versión troncal de gcc o struct-reorg-branch que se encuentra en desarrollo activo.

https://gcc.gnu.org/wiki/cauldron2015?action=AttachFile&do=view&target=Olga+Golovanevsky_+Memory+Layout+Optimizaciones+de+Estructuras+y+Objetos.pdf

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