Cose su C ++ che rendono nervosi i programmatori C.
C'è molta magia che sta accadendo sotto il cofano; costruttori, distruttori, metodi virtuali, modelli, ecc., possono rendere il codice C ++ molto più semplice e veloce da scrivere rispetto al codice C equivalente, ma più difficile da comprendere e ragionare (a seconda di quanto conosci C ++ e le sue convenzioni associate). Qualcosa di così semplice come Foo newFoo;può invocare molto codice, a seconda di come Fooè stato definito il costruttore per la classe (e qualsiasi classe da cui dipende). Questo è anche il motivo per cui la convenzione deve scrivere ++itinvece che it++quando si scorre in un contenitore, poiché postfix ++comporta spesso un'operazione di copia costosa.
A seconda di ciò che stai facendo, può esserci un sovraccarico non banale, soprattutto per attività semplici. Prendi i seguenti due programmi, il primo in C, il secondo in C ++:
/* C version */
#include <stdio.h>
int main(void)
{
char greeting[] = "Hello, world";
printf("%s\n", greeting);
return 0;
}
/* end C version */
/* C++ version */
#include <iostream>
#include <string>
int main(void)
{
std::string greeting("Hello, world");
std::cout << greeting << std::endl;
return 0;
}
/* end C++ version */
Comportamento identico, non molta differenza in termini di sorgente, ma sulla scatola di SLES 10 su cui lavoro con gcc 4.1.2, il primo genera un eseguibile di ~ 9kb di dimensioni, mentre il secondo prende 12,5kb (nessuna ottimizzazione ), quasi il 28% più grande. Il stringtipo C ++ è molto più facile da lavorare con IMO rispetto alla libreria di stringhe C, e i flussi C ++ sono molto più flessibili e personalizzabili rispetto ai flussi C, ma per un codice davvero morto come questo, potrebbero non valere l'overhead.
Il C ++ è un linguaggio enorme rispetto al C, con una semantica estremamente complessa. Ci vuole molto più tempo per acquisire padronanza del C ++ rispetto al C, il che significa che molte persone che affermano di conoscere il C ++ non lo conoscono come pensano di fare.
Cose su C che rendono nervosi i programmatori C ++
C non è un linguaggio di programmazione sicuro per alcun tratto dell'immaginazione; nessun limite di controllo sugli array porta a un sacco di comportamento sfruttabile (sia attraverso la funzione ormai morta gets, sia attraverso scanfgli identificatori di conversione %se %[). Il C ++ almeno ti dà contenitori che generano eccezioni se provi ad accedere al di fuori del loro intervallo attualmente definito; tutto ciò che ti dà C è (se sei fortunato) una violazione della segmentazione.
La gestione della memoria in C è molto laboriosa e soggetta a errori, rispetto agli strumenti forniti da C ++. Se stai costruendo il tuo contenitore, sei responsabile della corrispondenza di tutte le chiamate malloce free, assicurandoti che le allocazioni abbiano esito positivo, il backup di eventuali allocazioni parziali in caso di errore, ecc. In C ++, aggiungi semplicemente elementi a o rimuovere gli oggetti dal contenitore. Se c'è un problema, verrà generata un'eccezione.
Allo stesso modo, la gestione degli errori in C è un dolore nel culo rispetto agli strumenti forniti da C ++ (vale a dire, eccezioni). La cosa davvero divertente è quando hai allocato un mucchio di memoria e poi hai colpito un muro durante l'elaborazione; come è necessario tornare indietro, è necessario rilasciare quella memoria nel giusto ordine. Con i principi C ++ e RAII, questo è (relativamente) facile da fare.
Quindi, quando uso uno sopra l'altro?
Se quello che stai scrivendo è una palude semplice, leggilo / confondilo / sbarazzati della sua applicazione, il cui comportamento può essere descritto in modo pulito in termini di input e output e le prestazioni contano, quindi preferisci C su C ++. Altrimenti, preferisci C ++