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 ++it
invece 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 string
tipo 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 scanf
gli identificatori di conversione %s
e %[
). 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 malloc
e 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 ++