2009-10-12 6 views
6

Ich habe ein wenig Erfahrung in C/C++ von der Hochschule, aber habe seit Jahren nicht darin gearbeitet. Welche Dinge muss ich wissen, um überhaupt für eine c/C++ - Stelle in Frage zu kommen?Ich bin ein erfahrener C# -Entwickler, welche Dinge sollte ich wissen, um effektiv in c/C++ zu programmieren?

+16

Sie sollten herausfinden, ob die Position eine C-Position oder eine C++ - Position ist. Diese erfordern sehr unterschiedliche Fähigkeiten. –

+0

Deprimierend, auf der Ebene der Sichtung von Anzeigen gibt es immer noch viele Beiträge als genau "C/C++" aufgeführt. Möglicherweise, weil Personalvermittler Google verwenden, was die Interpunktion sowieso ignoriert (ich mache nur Spaß, Google versteht tatsächlich "C++", möglicherweise als ein Sonderfall, der von süchtigen Googlern eingeführt wurde). Ich nehme C/C++ so, dass es "beide" bedeutet, bis das Gegenteil bewiesen ist, aber in fast allen Organisationen wird der Schwerpunkt eindeutig auf dem einen oder dem anderen liegen. –

+0

Ich persönlich fand es eine Qual, mit den 10 verschiedenen String-Implementierungen umzugehen. –

Antwort

9

Ich muss vielen Ratschlägen widersprechen, die Sie erhalten haben. Sie sollten nicht auf manuelle Speicherverwaltung konzentrieren. Die manuelle Speicherverwaltung war/ist in C schwer zu vermeiden. Die meisten C++ - Codes benötigen jedoch wenig manuelle Speicherverwaltung. Die manuelle Speicherverwaltung wird in einer großen Menge Code stark überstrapaziert, was zu vielen Problemen führt, die leicht zu vermeiden wären.

Die erste und wichtigste Sache zu studieren ist die Standardbibliothek. Es unterscheidet sich wesentlich von .NET (um es milde auszudrücken). Mein sofortiger Rat wäre, eine Kopie von Accelerated C++ aufzuheben und durch es zu arbeiten. Es ist für Leute in genau Ihrer Position gedacht (d. H. C++ lernen, aber bereits Erfahrung mit mindestens einer anderen Sprache), und für diese Situation bin ich mir ziemlich sicher, dass es kein besseres Buch gibt.

Edit: (hauptsächlich in Beantwortung von Kennys Kommentar) - es ist wahr, dass, besonders wenn Sie bestehenden Code beibehalten, es eine ziemlich gute Chance gibt, dass Sie mit dem Lernen über alle Arten von Unannehmlichkeiten jeder vernünftigen Person würde feststecken Vermeide es eher. Je nach dem Team, dem Sie beitreten, können Sie selbst im neuen Code hässlich bleiben. Leider, ohne eine ausreichende Menge an Hintergrund und Erfahrung mit der Sprache, ist es vielleicht gar nicht offensichtlich, worauf man achten sollte.

+1

Das Problem ist, dass manuelle Speicherverwaltung verwendet wird und gelernt und verstanden werden muss. Guter Rat aber. – kenny

+0

Stimmen Sie zu, dass STL und die Starnard-Bibliothek beträchtlich sind, aber ich denke, dass es Situationen gibt, in denen manuelles Speichermanagement wichtig ist. Vor allem, wenn Sie 1) viele kleine Objekte unterschiedlicher Größe zum Erstellen haben 2) bessere Debugging- oder Statistikfunktionen wünschen 3) Die Performance der Standardimplementierung ist nicht schnell genug. 4) Die Standardimplementierung ist in Echtzeitanwendungen nicht deterministisch. Speicherpools können hier sehr helfen! Aber ich stimme Ihnen zu, dass Sie nicht mit diesem Thema beginnen sollten. Andere Themen sind substantieller. – schoetbi

+0

@schoetbi: Ich wollte nicht sagen, dass niemand jemals die manuelle Speicherverwaltung in C++ lernen oder verwenden sollte. Die Frage war, was für einen Job in C++ zu beachten war. In einer priorisierten Liste sollte die manuelle Speicherverwaltung nicht das erste Element sein, und wenn sie auf der ersten Seite ist, sollte sie wahrscheinlich irgendwo ganz unten sein. –

17

Zeigerarithmetik würde wahrscheinlich an der Spitze der Liste stehen. Auch ein gutes Verständnis von Speicherverwaltung in der nicht verwalteten Welt würde helfen - wie zum Beispiel löschen, was Sie mit neu erstellen.

+10

Und noch wichtiger, verwenden Sie Klassen, um neue zu tun und für Sie zu löschen. – GManNickG

+8

Oder noch besser, zu wissen, warum Sie vermeiden sollten, new/delete zugunsten von RAII-Typen – JaredPar

+1

Erinnern natürlich, dass die Verwendung von Klassen für neue/löschen für Sie, und die Verwendung von RAII-Typen anstelle von new/löschen nur sinnvoll in C++ Welt. Wie an anderer Stelle gesagt, sind C und C++ nicht gleich. – Graham

0

Die Syntax kann jederzeit auch nach dem Erhalt einer Position jederzeit abgerufen werden. Es ist wichtig zu beachten, wie man ein Problem angehen kann. Welcher Algorithmus wird für ein bestimmtes Problem besser funktionieren? Wie viel objektorientierte Programmierung erinnerst du dich? Wie gut sind Sie mit Zeigern und Zeiger arithmetisch.

Ich denke, einige Syntax zu vergessen ist in Ordnung, das wichtigste zu lösen ist, wie man Probleme löst.

1

Wenn Sie C# bereits kennen, wären die größten Dinge, die Sie wahrscheinlich auffrischen möchten, Speicherverwaltung, Zeiger/Referenzen und (für C++) die STL.

6

Aus praktischer Sicht würde ich sagen, dass die Priorität Nummer eins darin besteht, dass Sie sich wieder in die manuelle Verwaltung der Objektlebensdauer einarbeiten. Die große Zeitersparnis in C# und der .Net-Welt ist die Magie, die der Garbage Collector bietet. Man muss immer noch Speicher in der verwalteten Welt verwalten, aber es ist eine viel einfachere Aufgabe und ist nicht unbedingt an die Aufrechterhaltung eines mentalen Modells von Objektbesitz und Lebensdauern gebunden.

In C/C++ betreten Sie wieder die Welt des behaarten Speichermanagements, der Lebensdauerverwaltung und des Objektbesitzes.

15
+1

Wow, in Ihrer Firma können Sie Boost verwenden? Wir werden jedes Mal darauf hereingefallen, wenn wir es versuchen. –

+2

Tut mir leid zu hören, dass es ziemlich praktisch ist. – luke

+0

Warum eine Firma ihren Entwicklern nicht erlauben würde, eine freie Bibliothek zu benutzen, um Zeit zu sparen, verblüfft mich:/ – GManNickG

0

Anders als arithmetische Zeiger wie erwähnt, Speicherverwaltung ist eine große Sache.

0

Zunächst ist die Speicherverwaltung, einschließlich der Zeiger ...

Und lernen etwas, was Cross-Plattform-Code (das ist, was Ich mag;))

1

Ich denke, es auf welche Art von C/C abhängt ++ Stellenposition, die du meinst. Für eingebettete Arbeit sollten Sie besser mit Zeigern umgehen und das "flüchtige" Schlüsselwort verstehen. Für höherwertige Inhalte (besonders in C++) möchten Sie wahrscheinlich einige der beliebten Bibliotheken kennenlernen (STL, Boost, etc.). Für die meisten C-Programme wird es wichtig sein, mit POSIX vertraut zu sein.

Nummer eins mit einer Kugel, denke ich - Speicherverwaltung. Das bedeutet malloc/free, new/delete, all das andere seltsame C++ Zeug (Kopierkonstruktoren), und Zeiger im Allgemeinen.

2

Es hängt davon ab, WAS Sie in Erfahrung haben. Kaum jemand hat Erfahrung in allem in und um C#. Eine Sache könnte Speicherverwaltung sein. Auf der anderen Seite, wenn Sie viel Erfahrung mit C# unsicheren Code haben, wissen Sie bereits fast alles, was es gibt. Andere Sache könnte Plattform/com Zeug sein. Das gleiche gilt, wenn Sie bereits viel Interop programmiert haben. Um effektiv zu sein, brauchen Sie wahrscheinlich nur etwas Übung. Auch der Programmierstil ist oft sehr unterschiedlich.

1

Zeiger verletzt, handle vorsichtig!

+3

Ich liebe meine Zeiger. auch wenn sie ein wenig spitz sind. ;) –

1

Der wichtigste Rat, den ich mir vorstellen kann: Versuchen Sie nicht, C# -Code-Praktiken mit C++ anzuwenden. Vermeide Objekte mit neuen, nutze freie Funktionen, vergiss die Reflexion ... behandle sie einfach als eine ganz andere Sprache und versuche sie von Grund auf neu zu lernen.

3

Ich möchte meine Zeiger auf Zeiger Zeiger Baby!

0

Wie von anderen angegeben, sollten Zeiger und Speicherverwaltung Ihre Prioritäten sein. Sie müssen unbedingt Zeiger verstehen. Das ist das schwierigste Konzept in der C/C++ Programmierung. Es scheint, dass viele Leute ihre Gedanken nicht um Zeiger herumkriegen und bis Sie das tun, werden Sie nie ein C oder C++ Programmierer sein.

Ja, es gibt großartige Bibliotheken, die Speicherverwaltung für Sie handhaben, aber da es eine Menge Code gibt, der ohne diese Bibliotheken entwickelt wurde, werden Sie wahrscheinlich mit einigen mallocs/frees oder new/delete zu tun haben. Es sei denn, Sie haben den Luxus, in einen Job einzusteigen, in dem Sie nur neuen Code schreiben und von Anfang an "Dinge richtig machen" können. Wenn Sie diese Firma finden, lassen Sie es mich wissen. Ich möchte auch meinen Lebenslauf einreichen!

0

Erste Sache zu lernen: C und C++ sind zwei verschiedene Sprachen. Sogar in Fällen, in denen Code in beiden gültig ist, ist es oft nicht gut Code in beiden (manchmal in keiner).

Wählen Sie eine der Sprachen aus und lernen Sie sie. Dann lerne den anderen, wenn du magst. C++ ist komplizierter, aber Sie werden eine Menge davon schon kennen. C ist weniger kompliziert, aber unterscheidet sich von C#. Mit C programmieren Sie auf einer niedrigeren Ebene, näher an der Maschine, was wünschenswert oder unerwünscht sein kann.

0

Ich würde Speicherverwaltung aus einer anderen Perspektive angehen: Lesen Sie ein Buch über die Cdmuter-Architektur, um einen Eindruck davon zu bekommen, was Speicher wirklich ist, und putzen Sie dann Ihren Assembler auf. Das wird dir das Wesentliche von dem geben, was unter der Haube (die in C sehr dünn ist) abläuft. C++ hilft dir, ein bisschen nach oben zu kommen, aber Assembler lauert immer noch unter der Haube.

Praktisch ist C++ C mit Klassen & Vorlagen.Das ist ein bisschen vereinfacht und technisch falsch, aber Sie bekommen 80% des Weges dorthin.

Then ... kaufen:

  • Die Programmiersprache C von Kernighan und Ritchie. Das ist das C Buch.

  • Die Programmiersprache C++ von Strousoup; das ist die Standard-C++ - Referenz.

Je nachdem, wie tief und Hardcore Sie erhalten, können Sie die effektive C++ Bücher und Accelerated C++ erhalten möchten.

0

Drücken Sie sich in den Kopf, bis Ihre Fähigkeit, Schmerzen zu fühlen, stirbt.

0

Meiner Meinung nach gibt es mehrere Dinge, die Sie lernen müssen/Refresh:

  1. Pointers (klassische und intelligente Zeiger), neue/löschen all das Zeug
  2. STL. Vor einigen Jahren gab es viele Leute, die C++ als "C mit Klassen" behandelten. Und es ist natürlich nicht der Punkt. Die Kenntnis von STL spart nicht nur viel Zeit, sondern gibt Ihnen auch ein gutes Verständnis dafür, wie einige Dinge in C++ (in Ihrem Code) erledigt werden sollten, nur um sie für andere Entwickler einfach zu verwenden.
  3. Vorlagen. Ich weiß, dass die meisten Leute denken, dass Vorlagen ziemlich einfach sind, aber wenn Sie ein wenig tiefer graben;)
  4. Boost. Genau wie STL gibt es viele interessante Dinge in Boost, die Sie in Ihrem täglichen Job verwenden können.

Ich denke, das sind die wichtigsten.

0

Wenn Sie planen, auf der Windows-Plattform zu arbeiten, können Sie eine Kopie von Advanced Windows Debugging, die eine gute Einführung in die Arten von Debugging-Tools enthält, die für Windows-Entwickler verfügbar sind.

Verwandte Themen