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++?
Sono uno sviluppatore esperto di C#, quali cose dovrei sapere per codificare efficacemente in c/C++?
risposta
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.
Il problema è che la gestione manuale della memoria viene utilizzata e deve essere appresa e compresa. Buon consiglio però – kenny
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
@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. –
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.
E, ancora più importante, utilizzare le classi per fare di nuovo e cancellare per te. – GManNickG
O meglio ancora, sapendo perché dovresti evitare di usare new/delete a favore dei tipi RAII – JaredPar
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
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.
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.
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.
- gestione della memoria (puntatori, allocazione di memoria, i riferimenti)
- The Standard Template Library
- Boost
Altro che l'aritmetica dei puntatori, come sottolineato, la gestione della memoria è un affare enorme.
primo è la gestione della memoria, tra cui puntatore ...
E imparare a codificare qualcosa di cross-platform (che è quello che mi piace;))
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.
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.
Puntatori feriti, maneggiarli con cura!
Amo i miei suggerimenti. anche se sono un po 'appuntiti. ;) –
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.
Voglio che i miei indicatori puntino ai puntatori baby!
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!
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.
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.
Colpisci te stesso in testa fino a quando muore la tua capacità di provare dolore.
A mio parere ci sono diverse cose che dovete imparare/aggiornamento:
- Puntatori (classici, e puntatori intelligenti), nuovo/eliminare tutta quella roba
- 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.
- Modelli. So che molte persone pensano che i modelli siano abbastanza semplici, ma se si approfondisce un po ';)
- 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.
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.
- 1. Rapido passaggio a Java per uno sviluppatore C++ esperto
- 2. Sono uno sviluppatore C++ esperto - come posso entrare nel settore dei giochi?
- 3. Il modo migliore/più rapido per imparare Java per uno sviluppatore esperto .NET/C# e C++
- 4. Sapere C e/o C++ mi rende uno sviluppatore migliore?
- 5. Sviluppatore incorporato, quali sono le competenze importanti
- 6. Cosa dovrebbe sapere un esperto C# /. Net/WPF?
- 7. Quali sono gli attributi transitori factory_girl? Perché dovrei usarne uno?
- 8. Quali sono le competenze di cui uno sviluppatore Drupal ha bisogno?
- 9. Quali sono le competenze dba essenziali che uno sviluppatore dovrebbe imparare?
- 10. Quali sono le cose che consumano più batteria in un'app per iPhone?
- 11. Quali sono le principali differenze tra IE7 e IE8 che uno sviluppatore web dovrebbe conoscere?
- 12. Quali sono le cose migliori da fare in un costruttore?
- 13. Quali sono i cinque concetti JavaScript che devo comprendere per essere un buon sviluppatore di AngularJS?
- 14. Limitazioni in Mono per uno sviluppatore di framework .Net
- 15. Essere uno sviluppatore pigro o non essere uno sviluppatore pigro?
- 16. Ci sono motivi per cui uno sviluppatore C# dovrebbe imparare Emacs/Vim?
- 17. Tutorial C++ per programmatore C esperto
- 18. Ottieni PyCharm per sapere quali classi sono mixate per
- 19. Learning Python per uno sviluppatore .NET
- 20. codificare Perché url, o quali personaggi codificare
- 21. Buon framework per uno sviluppatore C# da utilizzare per uno strato di presentazione visivamente stupefacente
- 22. Come sapere quali pacchetti sono stati utilizzati in R
- 23. Quali sono i punti dei file di intestazione in C?
- 24. Sviluppatore Android che si sposta su iOS: cosa devo sapere?
- 25. Sono un aspirante sviluppatore che vuole costruire grandi sistemi come PayPal. Quale percorso dovrei seguire?
- 26. API RESTful: dove dovrei codificare il mio flusso di lavoro?
- 27. Libri per imparare l'obiettivo C per un programmatore esperto
- 28. Come installare eclipse per sviluppatore java, sviluppatore c/C++, sviluppatore php allo stesso tempo?
- 29. Quali sono le differenze tra C, C# e C++ in termini di applicazione reale
- 30. Come imparare/capire efficacemente OOP in C#?
Si dovrebbe scoprire se la posizione è una posizione C o una posizione C++. Questi richiedono abilità molto diverse. –
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. –
Personalmente, ho trovato un problema affrontare le 10 diverse implementazioni di stringhe. –