2009-10-12 20 views
6

Ho un po 'di esperienza in c/C++ del college ma non ci lavoro da anni. Che tipo di cose ho bisogno di sapere per essere considerato anche per una posizione di lavoro c/C++?Sono uno sviluppatore esperto di C#, quali cose dovrei sapere per codificare efficacemente in c/C++?

+16

Si dovrebbe scoprire se la posizione è una posizione C o una posizione C++. Questi richiedono abilità molto diverse. –

+0

In modo deprimente, a livello di setacciare gli annunci ci sono ancora molti post elencati esattamente come "C/C++". Forse perché i reclutatori usano Google, che comunque ignora la punteggiatura (sto scherzando, in realtà Google capisce "C++", forse come un caso speciale introdotto da googler stuzzicati). Prendo C/C++ per significare "entrambi" fino a prova contraria, ma chiaramente in quasi tutte le organizzazioni l'enfasi sarà su uno o l'altro in modo schiacciante. –

+0

Personalmente, ho trovato un problema affrontare le 10 diverse implementazioni di stringhe. –

risposta

9

Devo essere in disaccordo con molti dei consigli che hai ricevuto. Si dovrebbe non concentrarsi sulla gestione della memoria manuale. La gestione manuale della memoria era/è difficile da evitare in C. La maggior parte del codice C++, tuttavia, non ha affatto bisogno di utilizzare la gestione manuale della memoria. La gestione manuale della memoria è pesantemente abusata in gran parte del codice, causando molti problemi che sarebbe stato facile evitare.

La prima e più importante cosa da studiare è la libreria standard. È sostanzialmente diverso da .NET (per usare un eufemismo). Il mio consiglio immediato sarebbe quello di prendere una copia di C++ accelerato e lavorarci sopra. È progettato per le persone che si trovano esattamente nella tua posizione (ad esempio, apprendono C++, ma hanno già esperienza con almeno un'altra lingua), e per quella situazione sono abbastanza sicuro che non ci sia un libro migliore disponibile.

Modifica: (principalmente in risposta al commento di Kenny) - è vero che, soprattutto se stai mantenendo il codice esistente, ci sono buone probabilità che sarai bloccato a conoscere tutti i modi di spiacevolezza che qualsiasi persona sana di mente avrebbe probabilmente piuttosto evitare. Allo stesso modo, a seconda della squadra a cui ti unisci, potresti essere bloccato dalla bruttezza anche nel nuovo codice. Sfortunatamente, senza una buona dose di background ed esperienza con il linguaggio, potrebbe non essere del tutto evidente cosa cercare.

+1

Il problema è che la gestione manuale della memoria viene utilizzata e deve essere appresa e compresa. Buon consiglio però – kenny

+0

D'accordo sul fatto che STL e la lib di starnard sono sostanziali, ma penso che ci siano situazioni in cui la gestione manuale della memoria è essenziale. Soprattutto se hai 1) molti piccoli oggetti di dimensioni diverse per creare 2) vuoi avere migliori funzionalità di debug o statistiche 3) Le prestazioni dell'implementazione standard non sono abbastanza veloci. 4) L'implementazione standard non è deterministica nelle applicazioni in tempo reale. I pool di memoria possono aiutare molto qui! Ma sono d'accordo con te che non dovresti INIZIARE con questo argomento. Altri argomenti sono più sostanziali. – schoetbi

+0

@schoetbi: non volevo dire che nessuno dovrebbe mai conoscere o utilizzare la gestione manuale della memoria in C++. La domanda era: cosa doveva essere considerato per un lavoro con C++. In un elenco prioritario, la gestione manuale della memoria non dovrebbe essere il primo elemento e, se si trova nella prima pagina, dovrebbe probabilmente trovarsi in un punto vicino al fondo. –

17

L'aritmetica del puntatore sarebbe probabilmente in cima alla lista. Inoltre, una buona comprensione della gestione della memoria nel mondo non gestito potrebbe essere utile, ad esempio ricordando di eliminare ciò che si crea con nuovo.

+10

E, ancora più importante, utilizzare le classi per fare di nuovo e cancellare per te. – GManNickG

+8

O meglio ancora, sapendo perché dovresti evitare di usare new/delete a favore dei tipi RAII – JaredPar

+1

Ricordando ovviamente che usare le classi per fare new/delete per te, e usare i tipi RAII al posto di new/delete ha senso solo nel C++ mondo. Come è già stato detto altrove, C e C++ non sono * gli stessi. – Graham

0

La sintassi può sempre essere rilevata in qualsiasi momento anche dopo aver ottenuto una posizione. La cosa importante da prendere in considerazione è come affrontare un problema. Quale algoritmo funzionerà meglio per un problema specifico. Quanta programmazione orientata agli oggetti ricordi. Quanto sei bravo con i puntatori e l'aritmetica del puntatore.

Penso che dimenticare la sintassi è ok, la cosa più importante da considerare è come risolvere i problemi.

1

Se si conosce già il C#, le cose più importanti che probabilmente si vorrà approfondire saranno la gestione della memoria, i puntatori/riferimenti e (per C++) l'STL.

6

Da un punto di vista pratico, direi che la priorità numero uno è di darti un allenamento nella gestione manuale della vita degli oggetti di nuovo. Il grande risparmio di tempo in C# e nel mondo .Net è la magia fornita dal garbage collector. Uno deve ancora gestire la memoria nel mondo gestito, ma è un compito molto più semplice e non è necessariamente legato al mantenimento di un modello mentale di proprietà dell'oggetto e di vite.

In C/C++, si sta ri-entrando nel mondo della gestione della memoria pelosa, gestione della durata e proprietà degli oggetti.

15
+1

Wow, la tua azienda ti consente di utilizzare Boost? Ci colpiamo ogni volta che ci proviamo. –

+2

Mi spiace sentirlo, è molto utile. – luke

+0

Perché una società non consente ai propri sviluppatori di utilizzare una libreria gratuita per risparmiare tempo: mi sconcerta:/ – GManNickG

0

Altro che l'aritmetica dei puntatori, come sottolineato, la gestione della memoria è un affare enorme.

0

primo è la gestione della memoria, tra cui puntatore ...

E imparare a codificare qualcosa di cross-platform (che è quello che mi piace;))

1

Penso che dipende da che tipo di C/C++ posizione di lavoro che intendi. Per il lavoro integrato, è meglio essere bravi con i puntatori e capire la parola chiave "volatile". Per cose di livello superiore (in particolare in C++), probabilmente vorrai imparare alcune delle librerie popolari che girano (STL, boost, ecc.). Per la maggior parte della programmazione in C, essere a proprio agio con POSIX sarà importante.

Numero uno con un proiettile, penso - gestione della memoria. Ciò significa malloc/free, new/delete, tutte le altre strane cose in C++ (costruttori di copie) e puntatori in generale.

2

Dipende da COSA hai esperienza. Quasi nessuno ha esperienza in tutto ciò che si trova all'interno e intorno a C#. Una cosa potrebbe essere la gestione della memoria. D'altra parte se hai molta esperienza con il codice C# non sicuro sai già tutto quello che c'è. Un'altra cosa potrebbe essere la piattaforma/roba comune. Stessa cosa se hai già fatto un sacco di programmi di interoperabilità. Per essere efficace probabilmente hai solo bisogno di un po 'di pratica. Anche lo stile di programmazione è spesso molto diverso.

1

Puntatori feriti, maneggiarli con cura!

+3

Amo i miei suggerimenti. anche se sono un po 'appuntiti. ;) –

1

Il consiglio più importante che riesco a pensare: non provare ad applicare le pratiche del codice C# con C++. Evita di creare oggetti con nuovi, usa funzioni libere, dimentica il riflesso ... trattalo come una lingua molto diversa e prova a impararlo da zero.

3

Voglio che i miei indicatori puntino ai puntatori baby!

0

Come affermato da altri, i puntatori e la gestione della memoria dovrebbero essere le vostre priorità. Devi assolutamente capire i puntatori. Questo è il concetto più difficile nella programmazione C/C++. Sembra che molte persone non riescano a farsi un'idea intorno ai puntatori e finché non lo farai, non sarai mai un programmatore C o C++.

Sì, ci sono grandi librerie che gestiscono la gestione della memoria per voi ma, poiché c'è un sacco di codice che è stato sviluppato senza quelle librerie, probabilmente avrete a che fare con mallocs/frees o new/delete. A meno che tu non abbia il lusso di entrare in un lavoro in cui stai scrivendo solo un nuovo codice e puoi "fare le cose per bene" sin dall'inizio. Se trovi quella compagnia, fammi sapere. Mi piacerebbe anche inviare il mio curriculum!

0

Prima cosa da imparare: C e C++ sono due lingue distinte. Anche nei casi in cui il codice è valido in entrambi, spesso non è un buon codice in entrambi (a volte in nessuno dei due).

Scegli una delle lingue e impara. Poi impara l'altro se vuoi. Il C++ è più complicato, ma ne avrai già molta familiarità. C è meno complicato, ma fa cose diversamente da C#. Con C, stai programmando ad un livello più basso, più vicino alla macchina, che può essere desiderabile o indesiderabile.

0

Vorrei affrontare la gestione della memoria da una prospettiva diversa: leggere un libro sull'architettura copmuter per avere un'idea di cosa sia realmente la memoria, quindi rispolverare il vostro assemblatore. Ciò ti porterà al nocciolo duro di quello che sta succedendo sotto il cofano (che è molto sottile in C). Il C++ ti aiuta a spostarti un po ', ma l'assemblatore è ancora in agguato.

In pratica, C++ è C con classi & modelli.È un po 'di semplificazione ed è tecnicamente scorretto, ma ti porta l'80% del tempo.

Poi ... acquistare:

  • The C Programming Language da Kernighan e Ritchie. Quello è il libro C.

  • Il linguaggio di programmazione C++, di Strousoup; questo è il riferimento C++ standard.

A seconda della profondità e dell'hardcore, è possibile ottenere gli efficaci libri C++ e C++ accelerato.

0

Colpisci te stesso in testa fino a quando muore la tua capacità di provare dolore.

0

A mio parere ci sono diverse cose che dovete imparare/aggiornamento:

  1. Puntatori (classici, e puntatori intelligenti), nuovo/eliminare tutta quella roba
  2. STL. Un paio di anni fa c'erano molte persone che hanno trattato il C++ come un "C con classi". E ovviamente non è questo il punto. La conoscenza di STL non solo ti farà risparmiare un sacco di tempo, ma ti darà anche una buona comprensione di come alcune cose dovrebbero essere fatte in C++ (nel tuo codice) solo per renderle facili da usare per altri sviluppatori.
  3. Modelli. So che molte persone pensano che i modelli siano abbastanza semplici, ma se si approfondisce un po ';)
  4. Boost. Proprio come STL ci sono molte cose interessanti in Boost che puoi usare nel tuo lavoro quotidiano.

Penso che quelli siano i più importanti.

0

Se si prevede di lavorare sulla piattaforma Windows, è possibile ottenere una copia di Advanced Windows Debugging che contiene un'ottima introduzione ai tipi di strumenti di debug disponibili per gli sviluppatori di Windows.

Problemi correlati