PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dumme Frage, aber 'C++' oder 'C Inkrement'?


Gast
2006-01-17, 22:03:41
Die Frage schoss mir gerade durch den Kopf und klingt vielleicht ein wenig doof.

Die Sprache heißt ja 'C++'. Aber was sagt man? Unabhängig von der sprachlichen Ausprache, 'C++' oder 'C-Inkrement'? Da ich irgendwie keinen kenne, mit dem ich mich jé groß mündlich darüber unterhalten habe, bin ich gerade ein wenig erstaunt.

Was sagen die Berufscoder? :)

zeckensack
2006-01-17, 22:06:00
"Plusplus"

Expandable
2006-01-17, 22:09:01
"Ce plus plus" ;o)

Coda
2006-01-17, 22:11:49
Auch wenns dumm klingt, aber orginal spricht man es "Si Plass Plass".

Gast
2006-01-17, 22:43:17
Auch wenns dumm klingt, aber orginal spricht man es "Si Plass Plass".

Hatte deinen Edit gerade gesehen, fast hät' ich selber angemerkt, dass es im Deutschen irgendwie komisch klingt (Äks-Äitsch-Tie-Äm-Äl mit einbezogen, wie es ein Bekannter ausspricht). ;)

Aber danke.

Coda
2006-01-17, 22:56:09
Mach ich auch ;)

Ich spreche englische Abkürzungen generell englisch aus X-D

noid
2006-01-17, 23:04:28
www.cplusplus.com - cincrement kenne ich nicht ,)

edit: warum haben die das nicht gleich d genannt?

Coda
2006-01-17, 23:06:59
C++ war soweit ich weiß nur ein Arbeitstitel und ursprünglich nicht als offizieller Name gedacht :)

Außerdem siehts cool aus wie ich finde :D

PS: D gibts inzwischen sogar http://www.digitalmars.com/d/

Demirug
2006-01-17, 23:08:12
www.cplusplus.com - cincrement kenne ich nicht ,)

edit: warum haben die das nicht gleich d genannt?

Weil der erste C++ "Compiler" nichts anderes war als ein Preprozessor der C Code erzeugt hat welcher dann einem C Compiler vorgesetzt wurde.

Marscel
2006-01-17, 23:08:13
edit: warum haben die das nicht gleich d genannt?

Gibts auch, aber das ist wohl nochmal ++: http://www.digitalmars.com/d/index.html

Coda
2006-01-17, 23:09:37
Weil der erste C++ "Compiler" nichts anderes war als ein Preprozessor der C Code erzeugt hat welcher dann einem C Compiler vorgesetzt wurde.Brauchst du eigentlich nicht in Anführungszeichen setzen. Compiler ist alles was von einer Sprache in eine andere übersetzt.

Gibts auch, aber das ist wohl nochmal ++: http://www.digitalmars.com/d/index.htmlDas ist übler Crap imho, aber tut hier nichts zur Sache. Vor allem der Sprachevergleich ist ein schlechter Witz.

Das Ding hat gute Ideen, aber die Umsetzung gefällt mir nicht.

Expandable
2006-01-17, 23:39:04
War der ursprüngliche Name von C++ nicht "C with Classes"?

Magnum
2006-01-18, 00:02:08
Die Ganze Welt hyped es, aber keiner schaut mal drin nach: Wikipedia (http://en.wikipedia.org/wiki/C++) weiss einiges über C++! Aussprache, Originaler Name, ....

... wollt ich nur mal sagen! :)

Gast
2006-01-18, 13:18:38
Was isn das für nen Käse? Warum ist "Garbage Collector - YES" Grün hinterlegt? Ich zietiere Bjarne Stroustrup: "C++ Is my favorite garbage collected language because it generates so little garbage". Das ist doch ein VORTEIL nicht so etwas zu benötigen.

ollix
2006-01-18, 13:21:18
Also ich sehe Garbage Collector - YES nur bei C# - aber ich habe auch Probleme mit den Augen.

Gast
2006-01-18, 14:21:54
http://www.digitalmars.com/d/comparison.html

Du hast erhebliche Probleme mit den Augen.... Programmiersprachen lassen sich nicht mit solchen YES/NO Tabellen auf Qualität vergleichen, das kommt da irgendwie so rüber als ob es so wäre.

Demirug
2006-01-18, 14:29:11
Was isn das für nen Käse? Warum ist "Garbage Collector - YES" Grün hinterlegt? Ich zietiere Bjarne Stroustrup: "C++ Is my favorite garbage collected language because it generates so little garbage". Das ist doch ein VORTEIL nicht so etwas zu benötigen.

Keine Sprache bräuchte einen Garbage Collector wenn sie die entsprechenden arbeit dem Entwickler aufdrückt wie es C++ tut.

Monger
2006-01-18, 14:30:35
Was isn das für nen Käse? Warum ist "Garbage Collector - YES" Grün hinterlegt? Ich zietiere Bjarne Stroustrup: "C++ Is my favorite garbage collected language because it generates so little garbage". Das ist doch ein VORTEIL nicht so etwas zu benötigen.

Wo gehobelt wird, fallen auch Späne! ;)
C++ hat ja auch Müllbeseitigung, nur muss da jeder selbst seinen Müll zur Deponie tragen.

Xmas
2006-01-18, 14:38:51
Was isn das für nen Käse? Warum ist "Garbage Collector - YES" Grün hinterlegt? Ich zietiere Bjarne Stroustrup: "C++ Is my favorite garbage collected language because it generates so little garbage". Das ist doch ein VORTEIL nicht so etwas zu benötigen.
Wenn du von Benötigen sprichst... manche C++-Programme benötigen theoretisch einen der hinter ihnen den Müll aufsammelt, weil sie Memory Leaks haben.

Mit einem GC ist es nicht möglich, irgendwo ein delete zu vergessen. Außerdem räumt man auch gleich mit Object Ownership auf, d.h. man muss nicht mehr aufpassen wem das Objekt denn nun "gehört" das man von einer Methode zurückbekommt.

Es hat alles seine Vor- und Nachteile. C++ gibt dir mehr Kontrolle, aber damit auch mehr Verantwortung. Allerdings braucht man diese Kontrolle meist nicht, weswegen ein gut implementierter Garbage Collector in der Regel ein Vorteil ist.

ollix
2006-01-18, 14:46:44
http://www.digitalmars.com/d/comparison.html

Du hast erhebliche Probleme mit den Augen.... Programmiersprachen lassen sich nicht mit solchen YES/NO Tabellen auf Qualität vergleichen, das kommt da irgendwie so rüber als ob es so wäre. Stimmt, hat aber dennoch nichts mit dem ersten Posting zu tun :)

Demirug
2006-01-18, 23:10:03
Wenn du von Benötigen sprichst... manche C++-Programme benötigen theoretisch einen der hinter ihnen den Müll aufsammelt, weil sie Memory Leaks haben.

Mit einem GC ist es nicht möglich, irgendwo ein delete zu vergessen. Außerdem räumt man auch gleich mit Object Ownership auf, d.h. man muss nicht mehr aufpassen wem das Objekt denn nun "gehört" das man von einer Methode zurückbekommt.

Es hat alles seine Vor- und Nachteile. C++ gibt dir mehr Kontrolle, aber damit auch mehr Verantwortung. Allerdings braucht man diese Kontrolle meist nicht, weswegen ein gut implementierter Garbage Collector in der Regel ein Vorteil ist.

Bei 24/7 Anwendungen hat C++ in der Regel ein viel größeres Problem als die Memory Leaks. Durch zunehmende Fragmentierung wird der Heapmanager immer langsamer und frisst sich langsam durch den Addressraum.

Eine Serveranwendung die ich mal geschrieben habe hat dadurch jeden Tag etwa ein halbes Prozent mehr CPU last gezogen bis sie dann die CPU am Anschlag hatte. Meist ging jedoch vorher der Addressraum aus.

Coda
2006-01-18, 23:15:15
Ich verwende ja noch viel C++ und mir fällt es überhaupt nicht schwer nicht zu vergessen Speicher wieder freizugeben. Aber das ist wohl Erfahrung. Wenn ich es doch mal vergesse habe ich Tools die mir sagen wo es leakt und die Sache ist schnell behoben.

Mir gefällt die Lösung von C++/CLI aber, in dem es ein gcnew und ein new gibt - man kann also verwenden was man will.

Bei 24/7 Anwendungen hat C++ in der Regel ein viel größeres Problem als die Memory Leaks. Durch zunehmende Fragmentierung wird der Heapmanager immer langsamer und frisst sich langsam durch den Addressraum.Sehr guter Punkt.
Man soll ja auch immer für jedes Problem die richtige Programmiersprache benützen, ich habe überhaupt nichts gegen .NET/Java.

Ich würde aber dennoch C++/CLI C# dafür vorziehen, weil ich die Mächtigkeit der Sprache mag.

Marscel
2006-01-18, 23:28:45
Durch zunehmende Fragmentierung wird der Heapmanager immer langsamer und frisst sich langsam durch den Addressraum.

Wie verhindert man denn soetwas?

Sammelt man die Speicheraddressen freigegebener Räume und schaut bei der nächsten Instanzierung nach, wo gerade ausreichend Platz ist für Objekt/Typ X oder verschiebt man besetzten Speicher in freien Speicher, sodass der Addressraum im höheren Bereich wieder frei wird (glaube ich irgendwie nicht)?

Coda
2006-01-18, 23:30:49
Ein GC kann sowas tun, weil er ja alle Pointer kennt die auf ein Objekt zeigen. Eine normale Speicherverwaltung hat keine Chance den Addressraum zu defragmentieren - eine Addresse an der einmal alloziert wurde darf nicht verändert werden.

Wobei die Sache mit 64bit eigentlich ziemlich entschärft wird.

Demirug
2006-01-18, 23:37:11
Wie verhindert man denn soetwas?

Sammelt man die Speicheraddressen freigegebener Räume und schaut bei der nächsten Instanzierung nach, wo gerade ausreichend Platz ist für Objekt/Typ X oder verschiebt man besetzten Speicher in freien Speicher, sodass der Addressraum im höheren Bereich wieder frei wird (glaube ich irgendwie nicht)?

Man muss sich eigene Heapmanager schreiben die zusätzliche Informationen ausnutzen.

@Coda. ich finden den C# Syntax für .Net einfach geschmeidiger. Ich nehme C++/CLI nur dann wenn ich komplexe COM Wrapper schreiben muß. Man kann das ja gut mischen.

Coda
2006-01-18, 23:41:51
Ich will aber Templates und Operator Overloading :(

Trap
2006-01-18, 23:47:22
Templates als Metaprogrammiersprache oder Templates als generische Datentypen? ;)

Coda
2006-01-18, 23:47:45
Ersteres, bzw. beides, oder hat C# jetzt schon Generics?

Trap
2006-01-19, 00:51:06
Generics sind seit .NET 2.0 wohl dabei, ich hab allerdings noch kein .NET Zeug geschrieben.

Ich finde Metaprogrammierung mit C++ unglaublich hässlich. Ja, es geht und ist besser als wenn garkein Metaprogramming angeboten wird, das sind aber auch schon alle positiven Punkte daran.

Expandable
2006-01-19, 12:12:46
Ersteres, bzw. beides, oder hat C# jetzt schon Generics?

Ja, mit C# 2.0 bzw. .NET 2.0 gibt's auch in C# Generics. Hmm... in C# geht kein Operator-Overloading?

Nachtrag: Natürlich geht in C# Operator Overloading. Hier gibt's z.B. ein Tutorial dazu: http://www.csharp-station.com/Tutorials/Lesson18.aspx

Und es ist eine C++-ähnliche Syntax (Beispiel aus oben verlinktem Tutorial):


public static Matrix3D operator +(Matrix3D mat1, Matrix3D mat2)
{
Matrix3D newMatrix = new Matrix3D();

for (int x=0; x < DIMSIZE; x++)
for (int y=0; y < DIMSIZE; y++)
newMatrix[x, y] = mat1[x, y] + mat2[x, y];

return newMatrix;
}


Wobei ich mich gerade frage - was ist der Unterschied zwischen matrix[x, y] und matrix[x][y] (beides ist in C# möglich)?

Gast
2006-01-19, 13:07:46
Aber hallo was soll denn das. In C++ KANN man auch nen GC implementieren, aber man MUSS nicht, das ist ein großer Vorteil gegenüber einer Sprach bei der einem der GC aufgebrummt wird. Das kann bei Speicherhungrigen Anwendung sehr an die Performance gehen wenn da städig der GC rumpfuschen muss.

Coda
2006-01-19, 13:29:55
Nachtrag: Natürlich geht in C# Operator Overloading. Hier gibt's z.B. ein Tutorial dazu:Also entweder hab ich das total verschlafen bisher oder das ist neu in .NET 2.0 :|

Xmas
2006-01-19, 15:01:37
Wobei ich mich gerade frage - was ist der Unterschied zwischen matrix[x, y] und matrix[x][y] (beides ist in C# möglich)?
matrix[x, y] ist EIN Operator[] mit zwei Parametern, der für das Objekt matrix aufgerugen wird, matrix[x][y] ist dagegen Operator[y] aufgerufen für den Rückgabewert von matrix[x]

Auf den Typ Array bezogen ist [x, y] für ein zweidimensionales Array vom Typ T während [x][y] für ein Array von (Referenzen auf) Array vom Typ T verwendet wird. Im letzteren Fall hat man eine zusätzliche Indirektion und benötigt Speicher für die Referenzen, man ist aber auch flexibler (Spalten können null sein, oder von ganz unterschiedlicher Länge).

Coda, AFAIK kennt Java kein Operator Overloading, C# hatte das dagegen von Anfang an.

Pinoccio
2006-01-19, 15:09:54
AFAIK kennt Java kein Operator OverloadingJein. Für Strings ist es gemacht worden, damit String+String geht. Ist aber AFAIK die einzige Ausnahme.

mfg Sebastian
der jeden Tag dafür betet, daß JAVA auch kein Operator Overloading bekommt ;-)

Coda
2006-01-19, 15:56:19
matrix[x, y] ist EIN Operator[] mit zwei Parametern, der für das Objekt matrix aufgerugen wird, matrix[x][y] ist dagegen Operator[y] aufgerufen für den Rückgabewert von matrix[x]Geht das in C++ eigentlich auch? Wenn nicht ist es eine gute Idee das einzuführen.

Coda, AFAIK kennt Java kein Operator Overloading, C# hatte das dagegen von Anfang an.Ja, hatte ich irgendwie verdrängt. Danke.

Expandable
2006-01-19, 17:52:44
Ja, hatte ich irgendwie verdrängt. Danke.

Und ab jetzt programmierst Du nur noch in C# oder was? :P

Danke an Xmas für die Erklärung. Gibt's zwischen [x, y] und [x][y] auch semantische Unterschiede?

Coda
2006-01-19, 18:09:53
Und ab jetzt programmierst Du nur noch in C# oder was? :P ;)

Danke an Xmas für die Erklärung. Gibt's zwischen [x, y] und [x][y] auch semantische Unterschiede?Das auf jeden Fall. Das eine ist ja nur ein Operator-Aufruf, das andere sind 2.

Übrigens geht das mit dem Komma in C++ nicht - hab nachgeschaut.

Expandable
2006-01-19, 18:41:51
Das auf jeden Fall. Das eine ist ja nur ein Operator-Aufruf, das andere sind 2.

Gut, lass es mich anders formulieren. [x][y] heißt ja, ich habe x Arrays, wobei jedes einzelne Element des Arrays wiederum ein Array mit y Elementen ist. Mit [i][j] greife ich somit auf das Element in der i-ten Zeile und der j-ten Spalte zu. Was aber bedeutet [x, y]? Das gleiche? Ist das im Speicher anders organisiert?

Weil die Unterscheidung, die auf dieser Seite getroffen wird, ist mir nicht ganz klar (weil deren "Jagged Arrays" sind ja auch mehrdimensional!):


Mehrdimensionale Arrays

Mehrdimensionale Arrays sind nicht wirklich schwieriger zu handhaben als eindimensionale - einzig und allein die Syntax ändert sich. Die Deklaration zum Beispiel sieht wie folgt aus:

int[,] arTestMDim;

Instanziert wird das mehrdimensionale Array-Objekt wie folgt:

arTestMDim = new int[4,5];
// oder in einer Zeile geht es auch
int[,] arTestMDim2 = new int[4,5];

Der Zugriff auf einzelne Elemente des Arrays funktioniert so:

arTestMDim[0, 0] = 5;
Console.WriteLine(arTestMDim[0, 0].ToString());

Arrays von Arrays (Jagged-Arrays)

Nun kommen wir zum letzten Arraytyp - dem Jagged Array. Dies ist ein Array, das andere Arrays aufnehmen kann. Deklariert wird ein solches wie folgt:

byte[] [] arTestJagAr;

Die Instanzierung erfolgt wie gewohnt (erste Zeile), allerdings müssen dann die Unter-Arrays ebenfalls nach Wunsch angelegt werden:

byte[] [] arTestJagAr = new byte[4] [];
for(int n = 0; x < arTestJagAr.Length; n++)
{
arTestJagAr[n] = new byte[3];
}

Übrigens geht das mit dem Komma in C++ nicht - hab nachgeschaut.

Jo, das war doch klar, oder? Schon allein deshalb, weil ich noch nie [,] in einem C(++)-Programm gesehen hab ;)

Coda
2006-01-19, 19:00:46
Gut, lass es mich anders formulieren. [x][y] heißt ja, ich habe x Arrays, wobei jedes einzelne Element des Arrays wiederum ein Array mit y Elementen ist. Mit [i][j] greife ich somit auf das Element in der i-ten Zeile und der j-ten Spalte zu. Was aber bedeutet [x, y]? Das gleiche? Ist das im Speicher anders organisiert?Das weiß ich nicht.

Trap
2006-01-19, 19:02:11
Natürlich kann man auch in C++ [a,b] schreiben. Bedeutet aber was ganz anderes als in C#. In C++ ist "," fast überall erlaubt und ist ein Sequenzoperator und bedeutet das erst a dann b ausgeführt werden soll und b als Ergebniss des Ausdrucks benutzt werden soll.

Also ist a[20,30] ein Zugriff auf das Element a[30].

Demirug
2006-01-19, 19:09:37
Bei der [x,y] Variante wird ein Array Objekt mit x*y Elementen angelegt.

Bei [x][y] haben wir zuerst ein Array mit x Elementen. Jedes dieser Elemente ist dann wiederum ein Array mit y Elementen.

Ist also komplett anders im Speicher abgelegt.

Coda
2006-01-19, 19:18:19
Natürlich kann man auch in C++ [a,b] schreiben. Bedeutet aber was ganz anderes als in C#. In C++ ist "," fast überall erlaubt und ist ein Sequenzoperator und bedeutet das erst a dann b ausgeführt werden soll und b als Ergebniss des Ausdrucks benutzt werden soll.

Also ist a[20,30] ein Zugriff auf das Element a[30].Stimmt. Deshalb hat man es wohl nicht gemacht, weil es die Kompatibilität mit C gebrochen hätte an dieser Stelle. Wobei man da eigentlich eher selten den Sequenzoperator benützt :|

Expandable
2006-01-19, 22:06:15
Natürlich kann man auch in C++ [a,b] schreiben. Bedeutet aber was ganz anderes als in C#. In C++ ist "," fast überall erlaubt und ist ein Sequenzoperator und bedeutet das erst a dann b ausgeführt werden soll und b als Ergebniss des Ausdrucks benutzt werden soll.

Also ist a[20,30] ein Zugriff auf das Element a[30].

Und was soll davon bitte der Sinn sein??

Demirug: Also ist ein [x,y]-Array kein Array im herkömmlichen Sinne sondern vielmehr eine Art "Liste", die über zwei statt einem Key identifiziert wird? Wäre das eine passende Beschreibung (wobei "Liste" jetzt nicht unbedingt mit einer Liste aus der STL gleichzusetzen ist)?

Demirug
2006-01-19, 22:54:55
Und was soll davon bitte der Sinn sein??

Demirug: Also ist ein [x,y]-Array kein Array im herkömmlichen Sinne sondern vielmehr eine Art "Liste", die über zwei statt einem Key identifiziert wird? Wäre das eine passende Beschreibung (wobei "Liste" jetzt nicht unbedingt mit einer Liste aus der STL gleichzusetzen ist)?

Bei .Net ist sowas ein mehrdimensionales Array. Listen haben dort im Vergleich zu Arrays die zusätzliche Eigenschaft das sie dynamisch ihre Größe verändern können.

Coda
2006-01-19, 23:00:50
Und was soll davon bitte der Sinn sein??Hat keinen, aber es gibt eben den ,-Operator in C, und der hat höhere Priorität als [].

Das konnte man nicht einfach ändern.

KiBa
2006-01-19, 23:19:48
Man muss sich eigene Heapmanager schreiben die zusätzliche Informationen ausnutzen.

Ist hier ein wenig OT, aber gibt es da irgendwo eine art how-to, was man alles beachten muß, wenn man einen eigenen Heapmanager in C++ schreiben will, der sich möglichst transparent in das System einbindet? Oder gibt es gar fertige Bibliotheken? Ich habe schon eine Art Heapmanager gebastelt, allerdings ist der sehr projektbezogen und nicht 100%ig korrekt, da ich nicht alle Speicheranforderungen kontrolliere, wie z.B. bei temporären Vektoren. Alle Links zu dem Thema wären willkommen...

und noch ne andere Frage: Was macht die Speicherverwaltung des .net- oder mono-Frameworks, wenn der Adreßraum fragmentiert ist? Wird wirklich zusammenhängender Adreßraum durch umkopieren anderer Teile gebildet, um eine Speicheranforderung zu erfüllen? Was gibts dabei für Garantien bezüglich des Fragmentierungsgrades (wird der Speicher notfalls komplett defragmentiert, um z.B. die ganzen 2 oder 3 GB zu belegen) und der Geschwindigkeit (kann es passieren, dass die Speicheranforderung sehr lange dauert)?

Trap
2006-01-19, 23:22:15
Und was soll davon bitte der Sinn sein??
Mein Beispiel hat natürlich keinen Sinn, aber man könnte sowas schreiben:
a[++array_access_counter,30];

Ist das jetzt besser oder schlechter als 2 Anweisungen dafür zu schreiben? ;)

Trap
2006-01-19, 23:31:05
und noch ne andere Frage: Was macht die Speicherverwaltung des .net- oder mono-Frameworks, wenn der Adreßraum fragmentiert ist?[...]
http://www.hi.is/~snorri/087133-03/bigsurv.pdf ist eine sehr gute Übersicht über verschiedene Garbage Collection Implementierungsmöglichkeiten.

Xmas
2006-01-20, 01:32:53
Ist das jetzt besser oder schlechter als 2 Anweisungen dafür zu schreiben? ;)
IMO in absolut jedem Fall schlechter ;) Ich muss sogar zugeben, dass mir diese Sequenzoperation bis heute nicht bekannt war (obwohl ich wusste das ',' ein Operator ist, nur nicht wozu).

Demirug: Also ist ein [x,y]-Array kein Array im herkömmlichen Sinne sondern vielmehr eine Art "Liste", die über zwei statt einem Key identifiziert wird? Wäre das eine passende Beschreibung (wobei "Liste" jetzt nicht unbedingt mit einer Liste aus der STL gleichzusetzen ist)?
Ein Mehrdimensionales Array in C# [x, y, ...] ist ein Objekt, das einen zusammenhängenden Speicherbereich verwaltet, der alle Werte aufnimmt.

Ein "Jagged Array" ist ein Array dessen Werte lediglich Referenzen auf andere Array-Objekte sind. Diese Referenzen können null sein oder auf Arrays beliebiger Größe verweisen, die sich jeweils an ganz unterschiedlichen Stellen im Speicher befinden.

Natürlich kann man das ganze auch problemlos beliebig komplex mischen. Genauso wie man ein zweidimensionales Array von Integern haben kann, kann man auch ein zweidimensionales Array von (Array von (dreidimensionalen Arrays von (Array von Integer))) haben:

int[,][][,,][] array = new int[3,7][][,,][];
array[2,6] = new int[5][,,][];
array[2,6][4] = new int[8, 11, 13][];
array[2,6][4][7,10,12] = new int[4];
array[2,6][4][7,10,12][3] = 42;

Wobei die Arraydeklaration für meinen Geschmack bei C# gerade falsch herum ist. Denn während [,][][,,][] zwar genau der Schreibweise in der letzten Zeile entspricht, kann man es nicht richtig klammern:
(((int[,])[])[,,])[]
entspricht eben nicht
zweidimensionales Array von (Array von (dreidimensionalen Arrays von (Array von Integer)))
obwohl es genau das ist.

Bei C/C++ gilt dagegen als Faustregel: Variablendeklarationen von rechts nach links lesen. Hilft insbesondere in Bezug auf const-Pointer.