Dinge über C ++, die C-Programmierer nervös machen
Unter der Motorhaube geschieht viel Magie. Konstruktoren, Destruktoren, virtuelle Methoden, Vorlagen usw. können dazu führen, dass C ++ - Code viel einfacher und schneller zu schreiben ist als der entsprechende C - Code, jedoch schwieriger zu verstehen und zu durchdenken (je nachdem, wie gut Sie C ++ und die damit verbundenen Konventionen kennen). Etwas so Einfaches wie Foo newFoo;
kann eine Menge Code aufrufen , abhängig davon, wie der Konstruktor für die Klasse Foo
(und alle Klassen, von denen er abhängt) definiert wurde. Dies ist auch der Grund, warum die Konvention lautet, ++it
statt it++
durch einen Container zu iterieren, da Postfix ++
oft einen teuren Kopiervorgang beinhaltet.
Je nachdem, was Sie gerade tun, kann es zu nicht trivialem Overhead kommen, insbesondere bei einfachen Aufgaben. Nehmen Sie die folgenden zwei Programme, das erste in C, das zweite in C ++:
/* C version */
#include <stdio.h>
int main(void)
{
char greeting[] = "Hello, world";
printf("%s\n", greeting);
return 0;
}
/* end C version */
/* C++ version */
#include <iostream>
#include <string>
int main(void)
{
std::string greeting("Hello, world");
std::cout << greeting << std::endl;
return 0;
}
/* end C++ version */
Identisches Verhalten, kein großer Unterschied in Bezug auf die Quelle, aber auf der SLES 10-Box, an der ich mit gcc 4.1.2 arbeite, generiert die erste eine ausführbare Datei mit einer Größe von ~ 9 KB, während die zweite 12,5 KB überschreitet (keine Optimierung) ), fast 28% größer. Der C ++ - string
Typ ist viel einfacher mit IMO zu arbeiten als die C-Zeichenfolgenbibliothek, und C ++ - Streams sind viel flexibler und anpassbarer als C-Streams, aber für wirklich hirntoten Code wie diesen lohnt sich der Aufwand möglicherweise nicht.
C ++ ist im Vergleich zu C eine riesige Sprache mit extrem komplexer Semantik. Das Erlernen von C ++ dauert viel länger als das von C, was bedeutet, dass viele Leute, die behaupten, C ++ zu kennen, es nicht so gut kennen, wie sie denken.
Dinge über C, die C ++ - Programmierer nervös machen
C ist keine sichere Programmiersprache. Die Überprüfung von Arrays ohne Einschränkungen führt zu einer Vielzahl von ausnutzbaren Verhaltensweisen (sei es durch die gets
Funktion now-dead oder durch scanf
die Spezifizierer %s
and und %[
conversion). Zumindest in C ++ gibt es Container, die Ausnahmen auslösen, wenn Sie versuchen, außerhalb des aktuell definierten Bereichs zuzugreifen. Alles, was C gibt, ist (wenn Sie Glück haben) eine Verletzung der Segmentierung.
Die Speicherverwaltung in C ist sehr arbeitsintensiv und fehleranfällig im Vergleich zu den von C ++ bereitgestellten Tools. Wenn Sie einen eigenen Container erstellen, müssen Sie alle Aufrufe malloc
und abgleichen free
, sicherstellen, dass die Zuweisungen erfolgreich sind, und alle Teilzuweisungen im Fehlerfall zurücksetzen. In C ++ fügen Sie einfach Elemente zu oder hinzu Gegenstände aus dem Behälter entfernen. Wenn es ein Problem gibt, wird eine Ausnahme ausgelöst.
In ähnlicher Weise ist die Fehlerbehandlung in C im Vergleich zu den Tools, die C ++ bereitstellt, ein Nervenkitzel (nämlich Ausnahmen). Was wirklich Spaß macht, ist, wenn Sie eine Menge Speicher zugewiesen haben und dann in Ihrer Verarbeitung an eine Wand stoßen. Wenn Sie zurücktreten müssen, müssen Sie diesen Speicher in der richtigen Reihenfolge freigeben. Mit C ++ und RAII ist dies (relativ) einfach zu bewerkstelligen.
Also, wann verwende ich eins übereinander?
Wenn das, was Sie schreiben, nicht einfach ist, lesen Sie es, spielen Sie damit herum, und entfernen Sie die Anwendung, deren Verhalten in Bezug auf Ein- und Ausgaben und Leistungsaspekte klar beschrieben werden kann. Dann ziehen Sie C C ++ vor. Ansonsten lieber C ++