In meiner Freizeit entwickle ich einen NES-Emulator als Hobby. Ich benutze C ++, weil es die Sprache ist, die ich am meisten benutze, die ich am meisten kenne und am meisten mag.
Aber jetzt, da ich einige Fortschritte im Projekt gemacht habe, stelle ich fest, dass ich fast keine spezifischen Funktionen von C ++ verwende und es in einfachem C hätte tun können und das gleiche Ergebnis erzielen können. Ich verwende keine Vorlagen, Überladen von Operatoren, Polymorphismus, Vererbung. Also, was würdest du sagen? soll ich in C ++ bleiben oder es in C umschreiben?
Ich werde das nicht tun, um an Leistung zu gewinnen, es könnte als Nebeneffekt auftreten, aber die Idee ist, warum ich C ++ verwenden soll, wenn ich es nicht brauche?
Die einzigen Funktionen von C ++, die ich verwende, sind Klassen zum Einkapseln von Daten und Methoden, aber das kann auch mit Strukturen und Funktionen geschehen. Ich verwende new und delete, kann aber auch malloc und free verwenden, und ich bin Verwenden der Vererbung nur für Rückrufe, was mit Zeigern auf Funktionen erreicht werden könnte.
Denken Sie daran, es ist ein Hobby-Projekt, ich habe keine Fristen, so dass die Overhead-Zeit und die Arbeit, die ein erneutes Schreiben erfordern würden, kein Problem sind und auch Spaß machen könnten. Die Frage ist also C oder C ++?
I use C++ because is the language I use mostly, know mostly and like mostly.
Und das ist die Antwort auf Ihre Frage. Sie sollten die Sprache nur während des Projekts wechseln, wenn es ein Problem gibt, das Ihre aktuelle Sprache nicht lösen kann.I don't use templates, operator overloading, polymorphism, inheritance.
Es wäre viel wertvoller, die Konzepte zu lernen und zu verwenden, als zu C zu wechseln. Da dies ein Hobbyprojekt ist, warum nicht ein paar Dinge verwenden, die Sie vorher noch nicht verwendet haben? Sie könnten jederzeit ein anderes Projekt in C starten und die Sprache lernen, aber für Ihr aktuelles Projekt ist ein Wechsel nicht sinnvoll.std::shared_ptr
,std::unique_ptr
,boost::scoped_ptr
,std::vector
,std::deque
,std::map
, etc. Für Callback - Funktionen, Blick in die Verwendung von functors, und in C ++ 11, Sie kann auch anfangen, Dinge wie Lambda-Funktionen zu verwenden.Antworten:
Sie verwenden es jetzt nicht, aber das nächste Mal , wenn Sie ein Speicherleck oder ein Doppel löschen bekommen, werden Sie wieder kommen betteln
std::vector<T>
,std::unique_ptr<T, Del>
undstd::shared_ptr<T>
, was diese Probleme fast trivialen easily- lösen kann. Das ist es, was mit jedem passiert, der C über C ++ verwendet, und die intelligenteren warten einfach nicht darauf, dass die Bugs auftauchen, bevor sie übergehen.Code, der C ++ verwendet
new
unddelete
direkt nicht wirklich dazu gehört, gehört zu dieser Art von Halbhaus, das wir als "C mit Klassen" bezeichnen. Das ist , wo die Sprache circa 1985 war Es ist nicht besonders ähnlich wie C ++, circa 2011. Aller Wahrscheinlichkeit nach , wo immer Sie C ++ gelernt einfach haben es nicht lehren sehr gut etwas , das leider eher Common- und mit einer besseren Ausbildung, Sie würden Nutzen Sie diese Funktionen.Insbesondere, wie ich oben aufgeführt habe, sind die generischen Datenstrukturen von C ++ und die Klassen für die Ressourcenverwaltung einfach alles, was C zu bieten hat, grundlegend überlegen. Wenn Sie ein dynamisch zugewiesenes Array möchten, verwenden Sie
std::vector<T>
. Das ist ein ziemlich häufiger Anwendungsfall. Wenn Sie sie nicht verwenden, besteht für Ihren Code ein enormes Fehlerrisiko, insbesondere im Zusammenhang mit der Ressourcenverwaltung. C ++ kann die Sicherheit gewährleisten und den Code so wiederverwenden, dass C ihn niemals berühren kann.Ich denke jedoch, dass Sie möglicherweise auch zu viel erwarten. Das Schreiben von Vorlagen und Überladungen von Operatoren ist für Bibliotheksbenutzer nicht üblich. Wenn Ihr Code verwendet
std::vector<T>
, müssen Sie keine Vorlage schreiben , um dies zu erreichen. Wenn Ihr Code verwendetstd::string
, zwingt Sie niemand, Ihre Operatoren zu überlasten. Sie müssen nur diese Dinge tun, um zu schreibenstd::vector<T>
undstd::string
- aber Sie können sie trotzdem voll ausnutzen.Polymorphismus / Vererbung hat auch nur einen bestimmten Anwendungsfall. Wenn Sie in Ihrem Code keine Vorlagen schreiben oder virtuelle Funktionen verwenden müssen, müssen Sie keine eigenen Vorlagen schreiben. In einigen Programmen oder Programmsegmenten müssen Sie keine eigenen Vorlagen schreiben.
Auch in C ist kein Leistungsgewinn gegenüber C ++ zu verzeichnen.
quelle
make_shared
existiert und Sie können eine einfachemake_unique
Vorlage schreiben , die den gleichen Job macht. Es ist sicherer.make_shared
effizienter ist. Nur werkseitige Funktionen bieten garantierte Ausnahmesicherheit.Selbst wenn Sie keine C ++ - spezifischen Funktionen verwenden, wird ein C ++ - Compiler aufgrund des strengeren Typsystems von C ++ mehr Probleme als ein C ++ - Compiler haben.
quelle
Ich würde es aus der anderen Richtung betrachten. Wirst du etwas gewinnen , wenn du den Code in C umschreibst? Selbst bei einem rein hobbyistischen Projekt sind mit einem solchen Umschreiben Kosten verbunden. Wenn es sonst nichts gibt, was ich als Opportunitätskosten bezeichne, dh die anderen Dinge, die Sie in dieser Zeit hätten tun können, wenn Sie
Ihre Zeitnicht damitverschwendet hätten, es in C umzuschreiben.Fazit: Wenn Sie nicht der Meinung sind, dass der Code in einer Umgebung verwendet werden kann, in der der Zugriff auf C ++ sehr eingeschränkt (oder nicht vorhanden) ist, wäre dies im besten Fall eine sinnlose Zeitverschwendung. Zumindest in meiner Erfahrung, es geht in der Regel weit darüber hinaus sehr schnell - denken wieder über Code , den ich habe in C ++ geschrieben , die hatte bis C werden umgewandelt, kann ich ziemlich deutlich , dass auch nicht vergessen , in ganz wenigen Fällen , in denen es schien , wie Es sollte trivial sein, ich habe viel mehr C ++ -spezifische Funktionen verwendet, als ich ursprünglich gedacht hatte. Um die Hoffnung zu haben, überhaupt nützlich zu sein, müssten Sie C89 / 90 verwenden. In diesem Fall werden Sie schnell daran erinnert, dass Sie alle Variablen am Anfang eines Blocks definieren müssen, anstatt dort, wo sie sich tatsächlich befinden benutzt.
Kurz gesagt, wenn Sie nicht sicher sind, dass das Umschreiben in C einen echten Vorteil bietet, gibt es fast zwangsläufig viel bessere Dinge zu tun.
quelle
Als allgemeinere Antwort:
Wechseln Sie nicht zu C ++, nur weil Sie einige der einzigartigeren Funktionen verwenden. Eines Tages benötigen Sie möglicherweise diese Funktionen und werden sich nur den Kopf zerbrechen, weil Sie C verwenden.
quelle
Für die Hobbyentwicklung würde ich in Betracht ziehen, wieder auf C umzuschalten. C- und C-ähnliche Sprachen werden mit größerer Wahrscheinlichkeit von winzigen Hobbyentwicklungsmodulen unterstützt.
Viele der Antworten stammen möglicherweise von professionellen Softwaretypen. Als Bastler werden Sie nicht ständig oder ganztägig programmieren. Überlegen Sie sich also, an welche Sprache Sie sich mit größerer Wahrscheinlichkeit erinnern oder die darin enthaltenen Macken vergessen, wenn Sie Ihr Projekt ein Jahr lang aufstellen und dann zurückkehren und versuchen, Ihren Code zu lesen, nachdem Sie beim Codieren verrostet sind. C ++ mit einem umfangreicheren Funktionsumfang kann je nach Codierungsstil mehr oder weniger Zeit in Anspruch nehmen.
quelle
Es ist nicht einfach, Ihre Fragen zu beantworten, da wir nicht wissen, ob Sie an dem Projekt arbeiten, um Ihre sprachspezifischen Fähigkeiten (C vs C ++) oder andere Programmierfähigkeiten (Design, Problemlösung usw.) zu verbessern.
"Die einzigen Funktionen von C ++, die ich verwende, sind Klassen zum Einkapseln von Daten und Methoden, aber das kann auch mit Strukturen und Funktionen geschehen." Das ist nicht wahr.
structs
in C unterstützen keine Kapselung und können keine Funktionen (Methoden) enthalten - zumindest nicht ohne Techniken wie Zeiger auf Funktionen. Außerdem sind Funktionen in C schwächer, weil sie nicht überladen werden können."Ich verwende new und delete, könnte aber auch malloc und free verwenden, und ich verwende die Vererbung nur für Rückrufe, was mit Zeigern auf Funktionen erreicht werden könnte." Wie bereits erwähnt, wird die Verwendung von direkt
new
unddelete
in C ++ nicht empfohlen . Außerdem sollte die IMHO- (und die GoF-) Vererbung in OOP nur dann der Komposition vorgezogen werden, wenn Polymorphismus erforderlich ist. Und ich denke nicht, dass es trivial ist, Polymorphismus (späte Bindung) in C mit Zeigern auf Funktionen zu erreichen.Abgesehen davon werde ich nicht versuchen, Sie davon zu überzeugen, dass C ++ "besser" ist als C, da dies eine Frage der Präferenz ist und immer von dem Problem abhängt, das Sie zu lösen versuchen (die Verwendung von OOP-Funktionen für die Entwicklung Ihres NES-Emulators könnte hilfreich sein) eine gute Idee).
quelle
structs
in C kann in der Tat verwendet werden, um Methoden zu kapseln. Sie erstellen einfach eine Struktur von Funktionszeigern und initialisieren sie so, dass sie auf die gewünschten Funktionen verweisen. Werfen Sie einen Blick auf lxr.linux.no/linux+v3.3/include/linux/fs.h#L1598 für ein Beispiel.printf
), aber dabei verlieren Sie jegliche Typprüfung. Es gibt keine Möglichkeit, eine endliche Menge akzeptabler Deklarationen zu haben: entweder 1 (und Sie erhalten eine Typprüfung) oder "viele" (und verlieren alle Typprüfungen, unter großem persönlichem Risiko). Wie bei den meisten Dingen in C ist es möglich, aber oft unangenehm.Ich bin ein sehr Anfänger, also kommen hier meine 2 Bits.
Ich lerne C und C ++ bei Wibit.net mit einigen netten grundlegenden Videotutorials. Vielleicht können sie Ihnen sehr helfen, einen Überblick über die "Situation" zu gewinnen (keine Werbung!).
Ich rate Ihnen, zu C zu wechseln, nur um zu lernen, dass Sie ein Hobbyist sind. Dies wird ein Vergnügen sein, kein Problem.
Ich rate mehr. Mach es in beiden Sprachen. Vergleichen Sie die Art und Weise und die Lösungen, die Sie finden und verwenden. Ich bin mir sicher, dass es nicht so einfach wird, wie Sie es erwarten ... aber Sie werden sicher viel lernen!
quelle
Hier sind die Vor- und Nachteile von C ++ gegenüber C:
quelle