Usando C ++ ma non usando le caratteristiche specifiche della lingua, dovresti passare a C?

16

Sto sviluppando un emulatore NES come hobby, nel mio tempo libero. Io uso C ++ perché è la lingua che uso maggiormente, la conosco principalmente e mi piace soprattutto.

Ma ora che ho fatto qualche passo avanti nel progetto mi rendo conto che non sto usando quasi nessuna caratteristica specifica del C ++, e avrei potuto farlo in C semplice e ottenere lo stesso risultato. Non uso modelli, sovraccarico dell'operatore, polimorfismo, ereditarietà. Quindi cosa diresti? dovrei rimanere in C ++ o riscriverlo in C?

Non lo farò per ottenere prestazioni, potrebbe essere un effetto collaterale, ma l'idea è perché dovrei usare C ++ se non ne ho bisogno?

Le uniche caratteristiche del C ++ che sto usando sono le classi per incapsulare dati e metodi, ma ciò può essere fatto anche con le strutture e le funzioni, sto usando new e delete, ma potrei usare anche malloc e free, e Uso l'ereditarietà solo per i callback, che potrebbero essere ottenuti con i puntatori alle funzioni.

Ricorda, è un progetto per hobby, non ho scadenze, quindi il tempo di lavoro e il lavoro che richiederebbe una riscrittura non sono un problema, potrebbe essere anche divertente. Quindi, la domanda è C o C ++?

    
posta Petruza 03.12.2011 - 22:03
fonte

8 risposte

40

Non lo stai usando ora, ma la prossima volta che perdi memoria o ottieni una doppia eliminazione, ti chiederai di tornare a std::vector<T> , std::unique_ptr<T, Del> e std::shared_ptr<T> , che può risolvere questi problemi facilmente, quasi banalmente Questo è quello che succede a tutti quelli che usano C su C ++, alla fine, e quelli più intelligenti non aspettano che i bug compaiano prima di spostarsi.

Il codice che usa new e delete direttamente non appartiene veramente a C ++, appartiene a quel tipo di semicatenente che chiamiamo "C con Classi". È qui che la lingua era circa 1985. Non è particolarmente simile a C ++, circa 2011. Con ogni probabilità, ovunque tu abbia imparato il C ++ semplicemente non lo hai insegnato molto bene - qualcosa che sfortunatamente è piuttosto comune - e con una migliore educazione, tu < em> avrebbe trovato l'uso di queste funzionalità.

Specificamente, come ho elencato sopra, le strutture di dati generici del C ++ e le classi di gestione delle risorse sono fondamentalmente di gran lunga superiori a qualsiasi cosa C possa offrire. Se si desidera una matrice allocata dinamicamente, utilizzare std::vector<T> . Questo è un caso d'uso piuttosto comune. Se non li stai utilizzando, il tuo codice è a rischio enorme di errori inutilmente, in particolare per quanto riguarda la gestione delle risorse. C ++ può garantire sicurezza e riutilizzare il codice in un modo che C non può mai toccare.

Tuttavia, penso che potresti anche aspettarti troppo. Scrivere modelli e sovraccarichi dell'operatore non è comune per i consumatori delle biblioteche. Se il tuo codice utilizza std::vector<T> , non è necessario scrivere un modello per farlo accadere. Se il tuo codice utilizza std::string , nessuno ti costringe a sovraccaricare i tuoi operatori. Devi solo fare quelle cose per scrivere std::vector<T> e std::string - ma puoi comunque trarne il massimo vantaggio.

Il polimorfismo / ereditarietà ha anche solo un caso d'uso specifico. Se il tuo codice non richiede la scrittura di modelli o l'utilizzo di funzioni virtuali, allora non è così e ci sono programmi o segmenti di programmi in cui non è necessario scrivere i propri modelli.

Inoltre, non c'è alcun miglioramento nelle prestazioni in C su C ++.

    
risposta data 03.12.2011 - 22:23
fonte
7

Anche se non usi le funzionalità specifiche di C ++, un compilatore C ++ avrà più problemi di un C a causa del più rigido sistema di tipo C ++.

    
risposta data 04.12.2011 - 02:23
fonte
6

Lo guarderei dall'altra direzione. Riuscirai a ottenere qualcosa riscrivendo il codice in C? Anche su un progetto puramente hobbistico, c'è un costo associato a una riscrittura del genere. Se non altro c'è quello che suppongo sarebbe chiamato costo opportunità - cioè, le altre cose che avresti potuto fare in quel momento se non avessi sprecare il tuo tempo riscrivendolo in C.

Bottom line: a meno che non pensiate che il codice possa realmente essere usato in qualche ambiente dove l'accesso a C ++ è veramente limitato (o inesistente), sarebbe una inutile perdita di tempo al meglio. Almeno nella mia esperienza, di solito va ben oltre molto rapidamente - ripensando al codice che ho scritto in C ++ che aveva per essere convertito in C, posso ricordare chiaramente che anche in abbastanza alcuni casi in cui sembrava che dovesse essere banale, stavo usando molte più funzionalità specifiche per C ++ di quanto inizialmente avessi capito. Per avere molta speranza di essere utile a tutti, dovresti avere come target C89 / 90, nel qual caso ti vengono velocemente ricordati cose come dover definire tutte le variabili all'inizio di un blocco invece di dove sono effettivamente usato.

In breve, a meno che non siate certi che la riscrittura in C fornirà un vantaggio reale, ci sono quasi inevitabilmente molte cose migliori da fare.

    
risposta data 03.04.2012 - 07:39
fonte
1

Come risposta più generale:

Non passare a C ++ solo perché stai utilizzando alcune delle sue caratteristiche più uniche. Un giorno potresti aver bisogno di quelle funzioni e ti batterà la testa perché stai usando C.

    
risposta data 04.12.2011 - 21:11
fonte
1

Per lo sviluppo di un hobbista, prenderei in considerazione il fatto che il passaggio a linguaggi semplici di C. C e C è più probabile che sia supportato su piccoli moduli di sviluppo per hobby.

Molte delle risposte qui potrebbero provenire da tipi di software professionali. Come hobbista, non starai programmando continuamente o a tempo pieno. Quindi considera quale lingua è più probabile che tu ricordi o dimentichi le stranezze all'interno, se organizzi il tuo progetto per un anno e poi torni indietro e prova a leggere il tuo codice dopo che ti sei arrugginito nella codifica. C ++, con un set di funzionalità più ricco, potrebbe richiedere più o meno tempo per riacquisire, a seconda dello stile di codifica.

    
risposta data 04.12.2011 - 21:55
fonte
1

Non è facile rispondere alle tue domande, poiché non sappiamo se stai lavorando al progetto per migliorare le tue abilità linguistiche (C vs C ++) o per migliorare altre capacità di programmazione (progettazione, risoluzione di problemi, ecc. ).

"Le uniche caratteristiche del C ++ che sto usando sono le classi per incapsulare dati e metodi, ma ciò può essere fatto anche con le strutture e le funzioni". Questo non è vero. structs in C non supporta l'incapsulamento e non può contenere funzioni (metodi) - almeno non senza l'utilizzo di tecniche come i puntatori alle funzioni. Inoltre, le funzioni in C sono più deboli perché non possono essere sovraccaricate.

"Sto usando new e delete, ma potrei usare malloc e free, e sto usando l'ereditarietà solo per i callback, che potrebbero essere ottenuti con i puntatori alle funzioni.". As deadmg menzionato, utilizzando direttamente new e delete in C ++ non è incoraggiato. Inoltre, l'ereditarietà di IMHO (e del GoF) in OOP dovrebbe essere preferita rispetto alla composizione solo quando è richiesto il polimorfismo. E non penso che sia banale ottenere il polimorfismo (legame tardivo) in C usando i puntatori alle funzioni.

Oltre a questo, non cercherò di convincerti che C ++ è "migliore" di C perché è una questione di preferenza e dipende sempre dal problema che stai cercando di risolvere (usando le funzionalità di OOP per sviluppare il tuo NES l'emulatore potrebbe essere una buona idea).

    
risposta data 04.12.2011 - 14:10
fonte
0

Sono un principiante, quindi ecco i miei 2 bit.

Sto imparando C e C ++ su Wibit.net con alcuni videotutorial di base, forse possono aiutarti molto a dare una panoramica della "situazione" (non un annuncio!)

Ti consiglio di passare a C, solo per imparare, dato che sei un hobbista, sarà un piacere, non un problema.

Consiglio di più. Fatelo in entrambe le lingue. Confronta il modo e le soluzioni che troverai e userai. Sono sicuro che non sarà "così facile" come ti aspetti ... ma sicuramente imparerai molto!

    
risposta data 03.04.2012 - 03:46
fonte
-1

Ecco i pro e i contro di C ++ vs. C:

  1. Passare a C renderebbe più semplice rimanere all'interno del sottoinsieme C ++ scelto, perché il compilatore darebbe quindi un errore quando si esce da esso. Se il problema principale è rimanere all'interno di un sottoinsieme deciso, questa alternativa dovrebbe essere scelta. (perché non abbiamo il supporto del compilatore per questo?)
  2. Una volta che puoi rimanere all'interno del sottoinsieme di funzioni c ++ scelto, la prossima cosa è provare a cambiare il sottoinsieme per sbarazzarti delle cattive convenzioni che infrangono il codice. Ciò richiede l'uso dell'intero c ++.
  3. Una volta che hai entrambi "rimanere all'interno del sottoinsieme" e "è un buon sottoinsieme", quindi spostati all'esterno delle funzionalità c ++ e inizia a pensare ai requisiti.
risposta data 04.12.2011 - 20:36
fonte

Leggi altre domande sui tag