C# und C++ | Unterschied?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Bei beiden handelt es sich um (primär) objektorientierte Programmiersprachen mit C-ähnlicher ("curly brace") Syntax. Da hören die Gemeinsamkeiten dann aber auch bald wieder auf.

C++ wird direkt in Maschinencode übersetzt und hat eine manuelle Speicherverwaltung (new/delete, new[]/delete[]). Für viele Aufgaben (z. B. GUI, Threading, Netzwerk- und Interprozesskommunikation, etc.) muss man direkt auf die API des Betriebssystems (z. B. PThreads, Sockets, etc.) bzw. eines GUI-Toolkits (z. B. Qt, GTK+, etc.) zugreifen.

C# wird in einen Zwischencode (namens Common Intermediate Language) übersetzt, welcher anschließend durch eine virtuelle Maschine ausgeführt wird. Um die Ausführungsgeschwindigkeit zu steigern kommt hierbei in der Regel Just-in-Time-Compilation zum Einsatz, d. h. Codefragmente können hierbei ebenfalls in Maschinencode übersetzt werden, aber eben nur "vorübergehend" zur Laufzeit. Es gibt eine umfangreiche Klassenbibliothek, welche Funktionalität für Threading (das .NET-Framework integriert hierfür das Task Parallel Library von Intel), Sockets, GUI (System.Windows.Forms, Windows Presentation Foundation, ...), etc. bereitstellt. Diese Klassenbibliothek abstrahiert weitgehend vom darunterliegenden Betriebssystem, was es einfacher macht, portablen Code zu schreiben. Die Sprache verfügt über eine automatische Speicherverwaltung (garbage collection), die nicht mehr referenzierte Objekte zur Laufzeit automatisch "zerstört" und den belegten Speicher letztlich freigibt. Das ist sehr hilfreich, da die manuelle Speicherverwaltung sich als eine der größten Fehlerquellen bei der Implementierung von Software herausgestellt hat.

C# ist letzten Endes eher mit Java vergleichbar, als mit C++. Java wird ebenfalls zunächst in einen Zwischencode (hier Bytecode genannt) übersetzt und anschließend durch eine Java Virtual Machine (z. B. die Referenzimplementierung namens Hotspot) ausgeführt. Hierbei kommt ebenfalls Just-in-Time-Compilation zum Einsatz. Auch Java verfügt über eine umfangreiche Klassenbibliothek, welche die Betriebssystemfunktionalität weitgehend abstrahiert, sowie über eine automatische Speicherverwaltung.

GandalfAwA  20.01.2018, 16:05

Danke für die ausführliche Antwort, war auch für mich hochinteressant! :-)

0

Der größte Unterschied ist die Ausführungsart des erzeugten Codes.

C++ wird direkt in Maschinencode übersetzt (Mit ausnahme C++/CLI von Microsoft), C# wird in einen Bytecode übersetzt, welcher von der CLI (eine Art virtuelle Maschine) erst zur Ausführungszeit in Maschinenbefehle umgesetzt wird (Just in time compiling).

Unter Windows ist die CLI als .NET Framework implementiert.

C# ist daher unabhängig vom jeweiligen Prozessor und der verwendeten Hardware und mittels Mono oder .NET Core auch unabhängig vom verwendeten Betriebssystem, sofern für den jeweiligen Prozessor eine Implementierung der CLI verfügbar ist.

Ein unter Windows kompiliertes C# programm ist damit auch ohne Änderung auf GNU/Linux lauffähig.

Zudem gibt es einige Syntaktische Unterschiede so hat C++ keine Interfaces und unterstützt Multiple Inheritance hingegen hat C# Interfaces aber kein Multiple Inheritance. Man C# sozusagen wie eine Mischung aus C++ und Java ansehen, wobei meiner Meinung nach aus beiden Welten das beste genommen wurde.

Zudem gibt es viele Konstrukte welche einem das Leben viel einfacher machen und die weder in Java noch in C++ so umgesetzt sind.

NoHumanBeing  05.01.2018, 17:51
Ein unter Windows kompiliertes C# programm ist damit auch ohne Änderung auf GNU/Linux lauffähig.

... zumindest prinzipiell.

Wenn ich absolute Pfade verwende und/oder hart kodierten Backslash ("\") als Verzeichnistrenner oder oder oder, dann wird's nix mit Ausführen unter Linux.

Wenn ich "sauber entwickle" wird es häufig funktionieren.

... aber auch nicht immer.

Ich erinnere mich noch, dass die Überladungen von ParseInt(...), ParseFloat(...), etc., die einen IFormatProvider entgegennehmen, in Mono lange Zeit nicht implementiert waren. Selbst als Mono bereits .NET 4.5 unterstützte, fehlten die entsprechenden Überladungen noch immer. Ob sie inzwischen implementiert sind, weiß ich nicht. Die entsprechende Funktionalität ist wirklich sehr grundlegend.

0
PeterKremsner  06.01.2018, 03:15
@NoHumanBeing

Diese Aussage habe ich natürlich auch auf ein mit Mono bzw .NET Core kompatibles C# Programm bezogen.

Wenn ich Code schreibe welcher zu den jeweiligen Runtimeenvironments nicht kompatibel ist kann dieser natürlich auch nicht ausgeführt werden ;)

1
Mikkey  05.01.2018, 19:05

Ich hänge die Bemerkung mal hier an, weil die Antwort schon recht umfassend ist:

Eines haben bis jetzt alle Antworter unterschlagen, nämlich ein ein einzigartige Eigenschaft, die es nur bei C++ gibt. In C++ können Objekte auf dem Stack instantiiert werden. Sie werden dadurch automatisch wieder entfernt, wenn der Scope verlassen wird, auch beim Auftreten einer Exception.

Dies eröffnet etliche Möglichkeiten, die verschiedene Sprachkonstrukte, die es in C# und Java (und auch Delphi) gibt, überflüssig machen. Es ist mit der Nutzung von Smartpointern sehr einfach, auch große Anwendungen ohne Speicherlecks zu schreiben. Man muss es nur wollen. Ein Garbage-Collector der (zumindest vor einigen Jahren noch) immer mal wieder das System zum einfrieren bringt, ist überflüssig.

1
PeterKremsner  06.01.2018, 03:12
@Mikkey

Der C++ Ansatz ist zwar effektiver alles in allem aber Fehleranfälliger sofern man beginnt Objekte am Heap an zu legen.

Für Objekte am Stack macht das allerdings durchaus Sinn, jedoch würde direkte Verwendung des Stacks bei C# auch nicht wirklich Sinn machen, wobei ich hier auf die Objektstruktur in der CLR verweise. Diese besteht Quasi nur aus einem Heap.

Ich kann aber auch in C# ein Objekt zum löschen markieren indem ich die Instanz einfach auf 0 setze und danach dem GC anweise einen durchlauf zu machen. Die Geschichte mit dem Einfrieren hab ich persönlich nocht nicht gemerkt, ich würde dabei aber eher an ein anderes Problem denken als nur den GC.

Möglicherweise benötigen einige Unmanaged Objekte im Code eine gewisse Zeit zur Deinitialisierung (quasi alle Objekte welche das IDisposable Interface implementieren), das Problem würde aber in diesem Kontext auch bei C++ auftreten, sofern man die Deinitialisierung nicht bewusst weg lässt.

1

Böse gesagt:

C# ist die von MicroSoft auf ihr Betriebssystem maßgeschneiderte Version von Java.

Java ist eine Weiterentwicklung von C++, wobei man fehlerträchtige Sprachelemente (z.B. Pointerarithmetik) weggelassen und automatische Garbage Collection eingeführt hat.

Shitstorm komme auf mich herab ;-)

NoHumanBeing  05.01.2018, 17:53

Es ist nicht "böse gesagt", sondern so ziemlich die einfachste und zutreffendste Erklärung, die es gibt. Die Parallelen zwischen den Sprachen sind wirklich unübersehbar. Jeder, der Java und C-Sharp beherrscht, weiß, wie einfach es ist, zwischen den Sprachen zu wechseln bzw. das eine zu erlernen, wenn man das andere bereits beherrscht.

0

Beides sind Programmiersprachen..

C# kommt mit einem großteil von C++ und einem Teil Java.. Man hat versucht das beste aus beidem zu nehmen und es anzupassen.

C++ hat teilweise recht komplizierte Vorgänge, die mit C# verbessert wurden