2012-03-27 18 views
8

El estándar C no permite ciertas optimizaciones de estructuras: por ejemplo, reorganización de campos, combinación de campos, descarte campos de los que nunca se lee, elevación de campos fuera de la estructura si pueden convertirse en variables automáticas , etc. Esto es necesario por varias razones, incluyendo diseños de estructuras consistentes en unidades de compilación y permitiendo estructuras compatibles con cast.Optimización de estructura de compilador C

¿Los compiladores modernos (por ejemplo, gcc, clang, Visual C) admiten extensiones que me permiten decir que es ¿Está bien hacer estas optimizaciones?

Naturalmente, solo tendrían sentido para las definiciones que eran locales para una sola unidad de compilación, de modo que el compilador pudiera ver todos los usos posibles de la estructura; y ciertas cosas (como las definiciones de estructura compatibles con conversión mencionadas anteriormente) quedarían inutilizables. Pero para ciertas tareas esto podría ser una optimización muy valiosa.

sí sé que gcc utilizado tener una opción para permitir -fipa-struct-reorg precisamente esto, pero nunca funcionó muy bien y poco podrido, y finalmente fue llevado a cabo. Pero no sé si ha sido reemplazado por algo. Y no he podido encontrar nada en clang, lo que me sorprende porque podría pensar que este es precisamente el tipo de optimización que el clang habría terminado ...

+0

Would -flto ser capaz de optimizar cosas como esta? –

+1

* podría * ayudar si le da a struct variables clase de almacenamiento 'register', lo que obliga a no confiar en el diseño de la memoria en un nivel de lenguaje; sin embargo, el optimizador debería ser capaz de resolverlo independientemente de la presencia de 'register', y no tengo idea si hace alguna diferencia en la práctica ... – Christoph

+0

No funciona, lamentablemente, pero vale la pena intentarlo --- ejército de reserva. ('register' no es válido en miembros de estructura o variables estáticas, y parece que se ignora en variables automáticas.) –

Respuesta

4

No. No hay razón para tal cosa que se suministrará.

  1. No puede hacerlo allí donde se toma la dirección de la estructura y se envía a ninguna parte, ya que de todos modos podría contener un alias. Eso prácticamente excluye cualquier cosa que esté fuera de una función.

  2. Si puede realizar y realizar el análisis requerido para indicar a los miembros de la estructura que "esto puede optimizarse si no se usa" (cuidado con las macros de cálculo de desplazamiento funky) puede verlo si es necesario o no y sácalo tú mismo.

  3. Si no está seguro, simplemente coméntelo y vea si obtiene un error de compilación.

+0

Bueno, claro, pero esto no es realmente relevante --- No estaba preguntando sobre el análisis estático y, como dije en la pregunta original, estoy bastante preparado para evitar situaciones donde la optimización de las estructuras rompería el código. –

+1

@DavidGiven, estoy luchando por pensar en un caso de uso para esta función. Mi respuesta, básicamente, es que no hay una, por lo que no se ofrece. Si tiene uno, agréguelo a la pregunta. – Ben

Cuestiones relacionadas