Perché un eseguibile C dovrebbe essere più piccolo rispetto all'eseguibile in C ++

5

Sto cercando di capire perché le dimensioni del file di output sono significativamente diverse quando si utilizza un compilatore C e un C ++.

Stavo scrivendo un piccolo programma ciao mondo in C e C ++, ho notato che nella versione C, la dimensione dell'eseguibile era 93,7 KB e in C ++, la dimensione dello stesso programma ciao mondo era 1,33 MB. Non sono sicuro del perché sia così. Penso che potrebbe essere dovuto al fatto che il C ++ ha più librerie e spazi dei nomi da usare, quindi ho rimosso la riga using namespace std e ho semplicemente usato std::cout e il risultato è sempre lo stesso.

C

#include <stdio.h>

int main()
{
    printf("hello world");
    return 0;
}

// dimensione 93,7 KB

C ++

#include <iostream>

int main()
{
    std::cout<<"Hello world";
    return 0;
}

// dimensione 1,33 MB

Non sembra esserci molta differenza nel codice sopra. C'è una sorta di differenza del compilatore che crea le diverse dimensioni del file?

    
posta Hawk 26.06.2014 - 18:01
fonte

4 risposte

18

La maggior parte della libreria standard C ++, inclusi tutti gli stream di cui fa parte% co_de, sono classi di modelli in linea. Ogni volta che si cout uno di questi componenti della libreria inline, il compilatore copia e incolla tutto il codice nel file sorgente che lo include. Ciò aiuterà il codice a funzionare più velocemente, ma aggiungerà anche molti byte all'eseguibile finale. Questa è probabilmente la ragione dei risultati che hai ottenuto.

Eseguendo un test simile con il compilatore clang su OSX (Apple LLVM versione 5.1), usando i flag di default, ho ottenuto risultati comparabili:

hello_cpp_cout:

#include <iostream>
int main()
{
    std::cout << "Hello world" << std::endl;
    return 0;
}

Dimensione: 14.924 byte

hello_c:

#include <stdio.h>
int main()
{
    printf("hello world\n");
    return 0;
}

Dimensione: 8.456 byte

E, come bonus, ho provato a compilare un file #include con lo stesso codice di .cpp , cioè usando hello_c invece di printf :

hello_cpp_printf:

#include <stdio.h>
int main()
{
    printf("hello world\n");
    return 0;
}

Dimensione: 8.464 byte

Come puoi vedere, la dimensione dell'eseguibile è difficilmente correlata alla lingua, ma alle librerie che includi nel tuo progetto.

Aggiornamento:

Come è stato notato da diversi commenti e altre risposte, anche la scelta dei flag del compilatore influirà sulla dimensione dell'eseguibile compilato. Ad esempio, un programma compilato con flag di debug sarà molto più grande di uno compilato con flag di rilascio.

    
risposta data 26.06.2014 - 21:09
fonte
5

There doesn't seem to be much difference in the code above.

Sì, c'è. È un codice completamente diverso. La libreria iostream c ++ fa molto affidamento sul template che crea più codice inline e quindi l'eseguibile in C ++ è più grande.

Un altro motivo è che non hai rimosso gli sympols di debug dai file eseguibili, e per C ++ i simboli sono piuttosto dettagliati. Se sei sotto linux, puoi usare il comando "strip" per rimuovere quei simboli e la dimensione dell'eseguibile si ridurrà.

    
risposta data 26.06.2014 - 23:25
fonte
4

La differenza tra le dimensioni eseguibili dipenderà in gran parte dal tipo di collegamento specificato, dalle ottimizzazioni e dai compilatori utilizzati.

Data la differenza significativa nelle dimensioni finali, sembra che la variante C ++ sia collegata staticamente al runtime. Rimuovilo o cambialo e dovresti vedere un calo nelle dimensioni del C ++; per gcc (g ++) cerca --static* et. al e per msvc /MD e /MT

    
risposta data 26.06.2014 - 22:43
fonte
1

In realtà c'è parecchia differenza. Il codice C utilizza output non formattato e non localizzato. L'equivalente C ++ contiene un bel po 'di gunk per cambiare locale e quel genere di cose. Funzionalmente, sono tutt'altro che equivalenti. Semplicemente stai usando solo un minuscolo sottoinsieme dell'interfaccia C ++.

Tuttavia, più in generale, le dimensioni di codice più grandi sono un difetto di questa particolare parte della libreria Standard in particolare, che è ben noto per essere troppo ingegnerizzato, lento e ampio, piuttosto che per il linguaggio C ++ in generale.

    
risposta data 28.06.2014 - 22:03
fonte

Leggi altre domande sui tag