Quando si utilizza lo stesso codice, la semplice modifica del compilatore (da un compilatore C a un compilatore C ++) cambierà la quantità di memoria allocata. Non sono del tutto sicuro del perché questo sia e vorrei capirlo di più. Finora la migliore risposta che ho ricevuto è "probabilmente i flussi I / O", che non è molto descrittivo e mi fa meravigliare dell'aspetto "non paghi per ciò che non usi" del C ++.
Sto usando i compilatori Clang e GCC, rispettivamente versioni 7.0.1-8 e 8.3.0-6. Il mio sistema è in esecuzione su Debian 10 (Buster), più recente. I parametri di riferimento vengono eseguiti tramite il massiccio di Valgrind.
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
Il codice utilizzato non cambia, ma se compilo come C o come C ++, cambia i risultati del benchmark Valgrind. I valori rimangono coerenti tra i compilatori, tuttavia. Le allocazioni di runtime (picco) per il programma sono le seguenti:
- GCC (C): 1.032 byte (1 KB)
- G ++ (C ++): 73.744 byte, (~ 74 KB)
- Clang (C): 1.032 byte (1 KB)
- Clang ++ (C ++): 73.744 byte (~ 74 KB)
Per la compilazione, utilizzo i seguenti comandi:
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
Per Valgrind, corro valgrind --tool=massif --massif-out-file=m_compiler_lang ./compiler-lang
su ogni compilatore e lingua, quindi ms_print
per visualizzare i picchi.
Sto facendo qualcosa di sbagliato qui?
try
impatto sulle prestazioni nell'entrare in un blocco a spese di un ingombro di memoria maggiore, magari con una tabella di salto o qualcosa del genere. Forse prova a compilare senza eccezioni e vedi quale impatto ha. Modifica: in effetti, prova iterativamente a disabilitare varie funzionalità di c ++ per vedere quale impatto ha sul footprint di memoria.
clang++ -xc
invece di clang
, c'era la stessa allocazione, il che suggerisce fortemente la sua causa a causa delle biblioteche collegate
C
modalità e lo stesso esatto numero di byte C++
modalità. Hai fatto un errore di trascrizione?