Bueno, vamos a ver esto desde un punto de vista más general:
Para empezar, se necesita un ordenador con una CPU compatible que trabaja con equipo de destino de la salida del compilador . Puede pensar que esto es obvio, pero suponiendo que el código se compila en código máquina x86, no se ejecutará en una CPU Alpha que utilice instrucciones diferentes. Alternativamente, si compila a código de máquina x64, no se ejecutará en una CPU de solo x86. Entonces, el hardware correcto es necesario para ejecutar el programa C++, a diferencia de los lenguajes basados en máquinas virtuales como Java, que lo abstraen.
También necesitará el sistema operativo correcto. No soy un experto en portar programas, pero no creo que sea posible construir un solo ejecutable que se ejecute en múltiples sistemas operativos en C++. Por ejemplo, compilar incluso su segundo ejemplo en Windows tendrá mucho código de biblioteca de tiempo de ejecución detrás de escena antes y después de la llamada real a su función main()
. Esto hará cosas como preparar el montón e inicializar la biblioteca CRT. El CRT para Windows se implementa a través de la API de Windows. Puede enlazar estáticamente la biblioteca para que no se requiera ninguna DLL CRT, pero el código en su programa aún realiza llamadas a la API de Windows, por lo que sigue dependiendo de la plataforma. Como experimento compilé un programa vacío con enlaces estáticos en Windows con Visual Studio, y de acuerdo con Dependency Walker todavía hace referencia a KERNEL32.DLL para funciones como HeapCreate
y ExitProcess
. Por lo tanto, el programa "vacío" todavía le ofrece un montón de material del sistema operativo, en preparación para hacer algo útil (independientemente de si su programa hace algo útil).
Nótese también es muy posible que una versión mínima del sistema operativo: Visual Studio 2010 requiere Windows XP SP2 o superior, incluso para un programa vacío, debido a las llamadas realizadas a EncodePointer
y DecodePointer
. Ver this question.
El sistema tendrá que tener la memoria disponibles para poner en marcha su programa. Puede pensar que no hace nada, pero como se demostró anteriormente, antes de que main()
se llame una carga completa de OS, las llamadas de inicialización las realiza la biblioteca de su programa. Probablemente requieran algo de memoria y el tiempo de procesamiento necesario para ejecutarla.
Dependiendo de la configuración del sistema operativo, es posible que necesite suficientes privilegios de seguridad para ejecutar programas ejecutables.
Así que, en definitiva, para ejecutar un programa C++ vacío incluso con la vinculación estática, es necesario que la CPU correcta, el sistema operativo, el permiso para ejecutar el ejecutable, y el tiempo de memoria/procesamiento para completar el programa. En comparación con las tecnologías de VM como Java o .NET, los requisitos se reducirían probablemente a la máquina virtual correcta, los privilegios necesarios y el tiempo necesario de memoria/CPU para ejecutar el programa. Esto puede no ser tan simple como parece: es posible que necesite la versión correcta de una máquina virtual, como .NET framework 4.0. Esto puede complicar su proceso de distribución ya que la actualización de todo el JVM o .NET Framework para una máquina puede ser un proceso lento que requiere privilegios de administrador y tal vez una conexión a Internet. En algunos casos, esto podría ser un factor decisivo, ya que en raras ocasiones puede ser más fácil poder decir "se ejecutará en cualquier sistema operativo Windows compatible con x86 desde XP" en comparación con "cualquier máquina con la última versión virtual". máquina que solo se lanzó ayer ". Sin embargo, para la mayoría de los propósitos, el hecho de que la máquina virtual le permita (en teoría) olvidarse de la CPU y del sistema operativo facilita la distribución del programa; con C++, debe compilar, al menos, ejecutables por separado para cada combinación de plataforma y CPU que desee, independientemente de los requisitos adicionales de las bibliotecas que está utilizando.
toda la suerte en el mundo! – Chubsdad
@Chubsdad true: D –
Su segundo ejemplo no necesita ningún procesamiento, más allá de eso causado por un 'return 0;' from 'main()'. No llama a funciones de ningún tipo, y no tiene acceso a variables 'volátiles ', por lo que no tiene un comportamiento observable. –