una tipos sirve que prototipos para llamar funciones funcion estructura ejemplos declaracion como c++ c benchmarking

tipos - ¿Por qué la asignación inicial de C++ es mucho mayor que la de C?



prototipos de funciones c++ (2)

El uso del montón proviene de la biblioteca estándar de C ++. Asigna memoria para uso interno de la biblioteca en el inicio. Si no se enlaza con él, debería haber una diferencia cero entre la versión de C y C ++. Con GCC y Clang, puedes compilar el archivo con:

g++ -Wl,--as-needed main.cpp

Esto le indicará al vinculador que no vincule contra bibliotecas no utilizadas. En su código de ejemplo, la biblioteca de C ++ no se usa, por lo que no debe vincularse con la biblioteca estándar de C ++.

También puede probar esto con el archivo C. Si compilas con:

gcc main.c -lstdc++

El uso del montón volverá a aparecer, aunque hayas creado un programa en C.

El uso del montón obviamente depende de la implementación específica de la biblioteca de C ++ que está utilizando. En su caso, esa es la biblioteca GNU C ++, libstdc++ . Es posible que otras implementaciones no asignen la misma cantidad de memoria o que no asignen ninguna memoria en absoluto (al menos no en el inicio). La biblioteca LLVM C ++ ( libc ++ ), por ejemplo, no realiza una asignación de montón en el inicio, al menos en mi Linux máquina:

clang++ -stdlib=libc++ main.cpp

El uso del montón es el mismo que no vincular en absoluto contra él.

(Si la compilación falla, es probable que libc ++ no esté instalado. El nombre del paquete generalmente contiene "libc ++" o "libcxx".)

Cuando use el mismo código, simplemente cambiando el compilador (de un compilador de C a un compilador de C ++) cambiará la cantidad de memoria asignada. No estoy muy seguro de por qué esto es así y me gustaría entenderlo más. Hasta ahora, la mejor respuesta que he recibido es "probablemente las secuencias de E / S", que no es muy descriptiva y me hace preguntarme sobre el aspecto de "C ++ que no pagas por lo que no usas".

Estoy usando los compiladores Clang y GCC, versiones 7.0.1-8 y 8.3.0-6 respectivamente. Mi sistema se está ejecutando en Debian 10 (Buster), más reciente. Los puntos de referencia se realizan a través de Valgrind Macizo.

#include <stdio.h> int main() { printf("Hello, world!/n"); return 0; }

El código utilizado no cambia, pero si compilo como C o como C ++, cambia los resultados del punto de referencia de Valgrind. Sin embargo, los valores se mantienen consistentes en todos los compiladores. Las asignaciones de tiempo de ejecución (pico) para el programa son las siguientes:

  • GCC (C): 1,032 bytes (1 KB)
  • G ++ (C ++): 73,744 bytes, (~ 74 KB)
  • Clang (C): 1,032 bytes (1 KB)
  • Clang ++ (C ++): 73,744 bytes (~ 74 KB)

Para compilar, uso los siguientes comandos:

clang -O3 -o c-clang ./main.c gcc -O3 -o c-gcc ./main.c

clang++ -O3 -o cpp-clang ./main.cpp g++ -O3 -o cpp-gcc ./main.cpp

Para Valgrind, ejecuto valgrind --tool=massif --massif-out-file=m_compiler_lang ./compiler-lang en cada compilador e idioma, luego ms_print para mostrar los picos.

¿Estoy haciendo algo mal aquí?


Ni GCC ni Clang son compiladores, en realidad son programas controladores de cadenas de herramientas. Eso significa que invocan el compilador, el ensamblador y el enlazador.

Si compila su código con un compilador de C o C ++, obtendrá el mismo ensamblado producido. El ensamblador producirá los mismos objetos. La diferencia es que el controlador de la cadena de herramientas proporcionará una entrada diferente al vinculador para los dos idiomas diferentes: diferentes inicios (C ++ requiere código para ejecutar constructores y destructores para objetos con duración de almacenamiento de subprocesos estática o local en el nivel del espacio de nombres, y requiere infraestructura para la pila) marcos para admitir el desenrollado durante el procesamiento de excepciones, por ejemplo), la biblioteca estándar de C ++ (que también tiene objetos de duración de almacenamiento estático a nivel de espacio de nombres) y probablemente bibliotecas de tiempo de ejecución adicionales (por ejemplo, libgcc con su infraestructura de desenrollado de pila).

En resumen, no es el compilador el que causa el aumento de la huella, es el enlace de las cosas que eligió usar al elegir el lenguaje C ++.

Es cierto que C ++ tiene la filosofía de "pagar solo por lo que usas", pero al usar el lenguaje, pagas por ello. Puede deshabilitar partes del lenguaje (RTTI, manejo de excepciones) pero luego ya no está utilizando C ++. Como se mencionó en otra respuesta, si no usa la biblioteca estándar, puede pedirle al controlador que la omita (--Wl, - según sea necesario) pero si no va a usar ninguna de las funciones de C ++ o su biblioteca, ¿por qué estás eligiendo C ++ como lenguaje de programación?