Bastante simple pregunta… los Compiladores de estos días tienden a hacer una cantidad significativa de optimizaciones. También quitar sin usar las funciones de la salida final?

InformationsquelleAutor Paul Manta | 2011-06-02

9 Comentarios

  1. 21

    MSVC (el Visual Studio compilador/enlazador) puede hacer esto si usted compilar con /Gy y enlace con /OPT:REF.

    GCC/binutils puede hacer esto si usted compilar con -ffunction-secciones-fdata-secciones y enlace con --gc-secciones.

    No sé acerca de otros compiladores.

    • Tenga en cuenta que /OPT:REF lleva a no estándar de comportamiento: se optimizará a cabo funciones de las cuales sólo la dirección que se toma, por lo que la dirección se convierte en inválida. Esto no sucede por GCC.
  2. 16

    Como regla general, la respuesta es:

    Sí: por no usar static funciones.

    No:   por la parte no utilizada a nivel mundial las funciones disponibles.

    El compilador no sabe si alguna otra unidad de compilación de referencia. Además, la mayoría de objeto tipo de módulo no permiten funciones a ser eliminado después de la compilación y también no proporcionan una manera para que el enlazador para saber si existen referencias internas. (El enlazador puede decir si hay externo queridos.) Algunos conectores pueden hacerlo, pero muchas cosas que trabajar en contra de este.

    Por supuesto, una función en su propio módulo no se cargan innecesariamente por cualquier enlazador, a menos que sea parte de una biblioteca compartida. (Porque puede ser que se hace referencia en el futuro en tiempo de ejecución, obviamente.)

    • Creo moderno enlazadores no a las funciones de carga antes de que se utilizan. Al menos, dlopen con RTLD_LAZY implica que es posible.
  3. 5

    Muchos compiladores de hacer, pero depende de la aplicación concreta. Versiones de depuración a menudo se incluyen todas las funciones, para que puedan ser invocados o examinados desde el depurador. Muchos sistemas embebidos compiladores, por razones que no comprendemos totalmente(*), incluirá todas las funciones en un archivo de objeto si incluyen alguna, pero se omite completamente cualquier objeto de archivos que no se utilizan en absoluto.

    Tenga en cuenta que en los lenguajes que soportan la Reflexión (por ejemplo, Java, C#, vb.net, etc.) es posible, dado el nombre de una función, para crear una referencia a él en tiempo de ejecución, incluso si no existen referencias en el código. Por ejemplo, una rutina podría aceptar una cadena desde la consola, munge ella de alguna manera, y generar una llamada a una función con ese nombre. No habría manera de que un compilador y enlazador para saber qué nombres pueden ser tan generado, y por lo tanto no hay manera de saber qué funciones puede omitir de manera segura desde el código. No hay tal dificultad existe en C o C++, sin embargo, ya que no hay manera definida por el código para crear una referencia a una función, una variable o constante sin una referencia explícita existente en el código. Algunas implementaciones pueden arreglar las cosas para que de forma consecutiva-declaró constantes o variables se almacenan de forma consecutiva, y uno puede crear una referencia a una tarde-declaró uno añadiendo un desplazamiento a un estado anterior-declaró uno, pero el comportamiento de estos trucos es explícitamente no están garantizados por el C o C++ normas.

    (*)Entiendo que hace compilar y vincular más fácil, pero hoy en día los ordenadores no debería tener problemas para correr más sofisticados compilar y vincular los algoritmos de lo que hubiera sido práctico en décadas pasadas. Si nada más, un pase de dos pre-compilar/pre-link/compilar/link método podría en el pre-compilar/link fase producir una lista de las cosas que se usan y, a continuación, en el «real» compilar/link fase de omitir los que no lo son.

    • Aunque supongo que algo de embriagador de ensamblado en línea podría llamar a una función que se podría omitir de manera segura desde el código?
    • Por lo general, sólo si se toma la dirección de la función en cuestión.
  4. 5

    Con gcc si se enciende el optmizations se puede quitar sin usar funciones y de código muerto.

    Más sobre gcc optimizaciones se pueden encontrar aquí

  5. 3

    Bastante mucho tiempo, sí. A menudo es llamado enlazador de extracción.

  6. 2

    Cuando se trata de MS es la enlazador que se ocupa de este durante la fase de enlazado y el compilador podría advertir acerca de sin utilizar funciones estáticas (ámbito de archivo). Si desea que el enlazador para quitar sin usar funciones que utilice el /OPT:REF opción:

  7. 1

    Bajo MSVC y con funciones globales o variable puede utilizar __declspec( selectany ).

    Va a quitar la función o variable si no que se hace referencia en el código si la opción del vinculador /OPT:REF (Optimizaciones) está seleccionado.

  8. -3

    Todo depende del compilador y su configuración (código construido en la «depuración» de las configuraciones en general no está optimizada), junto con el código de sí mismo y el planeta de alineación.

    Subyacente cosa es: usted no debe preocuparse por eso. Confía en tu compilador.

    • Usted debe preocuparse por ello, si usted tiene algún requisito externo que el ejecutable contiene un cierto símbolo que no esté usando. No conseguir alrededor de eso.
    • Estoy de acuerdo en que a veces, el saber lo que su compilador salidas es necesario. Pero para la mayoría de los casos, no importa.
    • Seguro. Por otro lado, conocer sus herramientas y cómo usarlas correctamente.
    • Siempre extraño ver un downvote en algo escrito hace cuatro años.
    • ¿Por qué la fecha de publicación de la materia? No es como si el post es de calidad o corrección por arte de magia se ha mejorado simplemente en virtud de su edad? No es un vino fino.
    • Sí, pero ¿por qué ahora? Especialmente ya que no hay explicación.
    • encogimiento de hombros he llegado a través de los comentarios de edad todo el tiempo por todo tipo de razones. Las búsquedas de Google, después de incautos, descubriendo una pregunta relacionada al escribir uno nuevo… SÍ, es bastante deliberadamente bueno en dirigir a las personas para el material existente. De hecho, eso es más bien el punto! Presumiblemente, eso es todo lo que ha pasado aquí? Alguien azar encontró esta pregunta y no como tu «no te preocupes» la respuesta (porque son tontos y no entienden de abstracción)

Dejar respuesta

Please enter your comment!
Please enter your name here