Flame aus "Projekte": C oder C++ schneller bei Spieleprogrammierung?
-
Ich code in C++; Engine ist in C (performance !!!!!)
Wie kommst du drauf dass C++ langsamer ist als C?
Wenn du alles objektorientiert machst und für jede Variable eine eigene Get/Set-Methode, dann ist es natürlich langsamer. Aber das sollte man in der Spieleprogrammierung sowieso nicht machen.
-
aus genau dem gleichen grund warum asm schneller als c ist!
Mehr low - level weniger high level -> mehr freiheit -> mehr aufwand! Brauchst ja nur schaun wieviel speicherplatz ein c program und wieviel ein c++ programm braucht!
(Sicher hast recht dass wenn man in c++ wie in c schreibt wahrscheinlich ähnliche bis gleiche ergebnisse erhält, aber defakto macht das ja kaum jemand! Klassen sind cool, aber nur richtig verwendet; Richtig und sparsam!!!)
Hat außerdem noch anderen Grund: hab freeware lcc editor (wobei ich ma jetzt gar nicht sicher bin ob er echt so freeware ist. ich glaub ich kann ohne licenz sachen damit machen... und sonst kostet die regestrierung 20Euro oder so [dagegen MS-VC wahrscheinlich 2000Euro])
-
Manuelh87 schrieb:
aus genau dem gleichen grund warum asm schneller als c ist!
Mehr low - level weniger high level -> mehr freiheit -> mehr aufwand!
C++ hat aber exakt soviel low-level Freiheiten wie C.
Manuelh87 schrieb:
Brauchst ja nur schaun wieviel speicherplatz ein c program und wieviel ein c++ programm braucht!
So pauschal kannst du das nicht sagen, da vieles von der Implementierung abhängt.
-
Manuelh87 schrieb:
aus genau dem gleichen grund warum asm schneller als c ist!
Mehr low - level weniger high level -> mehr freiheit -> mehr aufwand! Brauchst ja nur schaun wieviel speicherplatz ein c program und wieviel ein c++ programm braucht!
LOL
-
@ groovemaster:
hast schon recht das ma das nicht so pauschal sagen kann, aber mit c++ programmieren meine ich auch klassen verwenden. Und vorallem sie zu viel zu verwenden!!! Natürlich hat C++ genauso low-level funktionen; aber totzdem seh ich viel öfter cout<<"hallo"<<" "<<"welt"; als printf("hallo welt");
Natürlich kann man nicht sagen dass ein c++ prog. immer größer ist als seine C variante! Aber probiers mal mit dem lcc und dem MSVC++ aus! Also meine vom lcc waren stets kleiner; liegt wahrscheinlich auch an lcc!
Ich dacht mir halt, ich mach ne OpenGL Engine mit dll Funktionen und ohne Klassen damit sie wirklich jeder verwenden kann und sie auch recht schnell ist. Ich persöhnlich verwend schon auch Klassen, aber halt nur wenn ich sie wirklich brauche.
Grad bei meinem letzten Projekt hab ich das Stark gemerkt. Zuerst hatte ich für jedes Token eine Klasse ,für jede Liste eine Klasse und die Hauptklasse CTokenFile. Hab aber gemerkt dass es ur langsam ist und sauviel code hat und hab die ersten beiden klassen weitestgehend durch typedef structs ersetzt + ein paar simple functionen und schon war der code ein 5tel! Liegt natürlich auch an den kürzungen.
VOn Geschwindigkeit er kann ich keine Aussage machen, da ma das bei dem Projekt ned vergleichen kann! vorher hab ich alles mit streamsgmacht aber jetzt wirds vorher in den Ram :p gladen und funktioniert auch so weit!
@interpreter:
mit dem lol kann ich nix anfangen! musst dich schon a bissal besser ausdrücken!cu Manuelh87
-
1. cout ist im gegensatz zu printf sicher, und ein funktionierendes programm ist besser als ein abstürzendes.
2. C++ programme können genauso schnell wie C-programme sein, kommt natürlich drauf an, inwieweit der compiler da optimiert(wenn ein compiler einen einfachen seter/geter nicht inlined ist er schlecht)(beweis, dass ein c++ programm soschnell wie ein C programms ein kann: der Comeau übersetzt das C++ programm direkt in C, und geht dann mit nem C-compiler drüber
)
3. C++ ist kein simples "alles in Klassen stecken", C++ sagt: Klassen da wo sie gebraucht werden
-
Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum Projekte verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Nicht alles was John Carmack sagt, ist Gesetz
Und bei Spielen wirst du denn Performance-Unterschied (wenn es denn einen gibt)
sowieso nicht bemerken. Deinem Post entnehme ich auch einfach mal, dass deine
Erfahrungen in C / C++ eh noch nicht so groß sind, dass du Programme schreibst,
die so stark optimiert sind, dass ein Unterschied C / C++ eine Rolle spielen
sollte.Die Vorteile von C++ (gerade bei Teamarbeit) sind einfach so groß, dass auch
die Mehrzahl der Spiele in C++ programmiert wurden.
-
Manuelh87 schrieb:
Natürlich hat C++ genauso low-level funktionen; aber totzdem seh ich viel öfter cout<<"hallo"<<" "<<"welt"; als printf("hallo welt");
Wirklich? Ich nicht. Ausserdem, was hat das mit low-level zu tun?
Manuelh87 schrieb:
Natürlich kann man nicht sagen dass ein c++ prog. immer größer ist als seine C variante! Aber probiers mal mit dem lcc und dem MSVC++ aus!
LOL. Ich vergleiche doch keine Äpfel mit Birnen. Du solltest dann schon mit ein und demselben Compiler vergleichen. Oder hast du zumindest die C Version vom LCC und vom MSC mit in den Vergleich einfliessen lassen? Zudem gibts C++ Compiler die noch besser optimieren als der MSC, zB Intel. Obwohl der MSC da auch schon recht gut ist.
Manuelh87 schrieb:
Zuerst hatte ich für jedes Token eine Klasse ,für jede Liste eine Klasse und die Hauptklasse CTokenFile. Hab aber gemerkt dass es ur langsam ist und sauviel code hat und hab die ersten beiden klassen weitestgehend durch typedef structs ersetzt + ein paar simple functionen und schon war der code ein 5tel! Liegt natürlich auch an den kürzungen.
Wie gesagt, alles eine Frage der Implementierung. Wer schlechten C++ Code schreibt liegt höchstwahrscheinlich immer hinter einer gängigen C Version. Allgemein ist mit C++ genauso schneller Code wie mit C möglich, da beide auf dem gleichen Sprachkern basieren.
Ich will jetzt nicht schon wieder 'ne Diskussion vom Zaun brechen, es ist aber schon komisch, dass man solche Argumente immer wieder hört. Die eine Sprache ist schneller als die andere, blabla. Was man letztendlich vergleicht, sind Implementierungen, nicht mehr und nicht weniger.
Ich kann mich erinnern, dass es vor geraumer Zeit mal einen Thread "C++ vs. Java" gab. Dort hat dann jemand gesagt, dass Java schneller ist als C++, und dazu 'nen Link gepostet, wo das jemand mit Tests über diverse Algorithmen "bewiesen" hat. Als ich mir die Seite mal etwas näher angeschaut hab, bekam ich zwar keinen Lachkrampf aber amüsiet hab ich mich trotzdem. Was hatte der Kerl nun gemacht? Ganz einfach, er schrieb mehrere Programme (für mehrere Algos), jeweils eine C++ und eine Java Version, liess diese dann über ein Kommandozeilenskript mehrfach ausführen und hat am Beginn und Ende dieser Aktion die Zeit genommen. Toll. Was er damit gemessen hat, sind somit vielmehr die Lade- und Entladezeiten der Executable, als die Algorithmen selbst. Diese fliessen damit nur zu einem gewissen Anteil (vermutlich zwischen 5% und 25% - je nach Komplexität des Algos) in das Endergebnis ein.
Man sollte also schon wissen, was man tut, bevor man sich zu irgendwelchen Aussagen hinreissen lässt.
-
ich möchte nur ein paar anmerkungen machen.
a) zwischen structs und klassen gibt es prinzipiell erst mal keinen unterschied, wenn man spezielle objektorientierte elemente wie z.b. virtuelle methoden weglässt. daher ist auch die "ausführungsgeschwindigkeit" die selbe, denn ein:
mybitmap.DrawLine(0,0,0,0);
ist mindestens genauso schnell wie ein:
DrawLine(0,0,0,0,&myBitmap);
(eher schneller, da der kompiler den "klassen parameter" selber generiert, und somit vielleicht besser optimieren kann)
b) der wirkliche geschwindigkeitsrelevante teil einer _großen_ applikation (kein miniprojekt einer einzelnen person, mit ein wenigen tausend zeilen) sind die algorithmen. diese werden in c++ in den selben maschinencode übersetzt wie in c. eine "for-schleife" zum beispiel, die ein array durchläuft und berechnungen durchführt, ist in c++ kein bischen langsamer als in c. berechnungen großer und komplizierter algorithmen verbrauchen die meiste zeit und nur das ist für die ausführungsgeschwindigkeit eines programms wichtig. da ist das bischen was c++ gegenüber c an verwaltungscode durch bestimmte objektorientierte elemente hat, vollkommen vernachläßigbar, selbst in einem spiel, da es sich hier um weniger als millionstel sekunden handelt. wer sich über solche kleinigekiten bei einem großen projekt gedanken macht wird damit nie geld verdienen können, da er nie das projekt fertig bekommt. sowas spielt einfach keine rolle.
ausserdem ist man innerhalb einer methode einer klasse mehr oder weniger wieder in der "c programmierung".c) der vorteil, den man durch die vollkommene objektorientierte programmierung erhält, ist bei großen projekten insbesondere, aber auch bei komplizierten algorithmen, von unendlichem wert im verhältnis zum "mini geschwindigkeits nachteil" von c++ gegenüber c.
für mich gibt es eigentlich keinen grund (mehr:) c zu benutzen, da c++ (vom prinzip her) genau das gleiche ist wie c, nur das man structs jetzt klassen nennt und man alle daten und allen code an namensräume (die klassen) bindet.
-
Ihr habt natürlich mit allem irgendwie recht was ihr da sagt! Aber ich frag jetzt mal in die runde wer aller mit c und c++ gearbeitet hat und wer sich dann die ergebnisse im peviewer angeschaut hat??? na wer?
Aber ihr seid alle überzeugt das C++ gleichschnell wie C ist!Nochwas: Postcount ist nicht proportional zu Wissen und Verständnis sondern eher von Internet und Modem (In meinem Fall
)
weiter im Text:
Natürlich, ich weiß nicht wie oft ich das noch sagen soll: ein c++ programm gecodet wie in C und mit MSVC übersetzt der das dann auch mit dem C-COmpiler macht ist mir klar das das gleich ist! Wie oft muss ich das noch sagen.
aber ich seh immer öfter das Leute ständig für jeden mist ne neue Klasse anlegen und ableiten usw... Und das verlangsamt den Code und zwar erheblich!!!Dann:
Es gibt serwohl nen unterschied zwischen class und typedef struct!!!
class hat meistens nen Construktor! Bei Übergabe gibts dann noch nen Kopierkonstruktor usw. Das alles muss aber auch ausgeführt werden! In C dagegen wird nur ne Addresse gepusht! das is ne funktion vom cpu und geht schneller alles der jump zum Konstruktor und dann dort noch der ganze code!Außerdem:
Hab ich ja nix gegen C++ und code auch meistens in C++ aber ich versuche wenige klassen zu verwenden! nur wenns wirklich sinnvoll ist! Ich code aber auch viel C (für TI) und es gibt gründe warum dort kein C++ gibt! Und zwar performance gründe (und wer das nicht glaubt fragt google) und speicherplatzgründe! Also erklärt mir nicht dauernd das das genau gleich ist! (Außer Beispiel oben)
Ich hab ja schon erläutert warum ich die Engine in C angefangen hab!
Die Gefahr mit C++ ist meines erachtens dass ma klassen zu stark verwendet und der code darunter leidet weil viele c++ coder leider mehr keine ahnung von asm haben! Das ist bedauerlich aber es ist halt kompliziert und viele wollen das nicht lernen weil man nicht wirklich ergebnisse sieht (am anfang)!
Ich selbst verwende ja auch C++ mit allem drum und dram... ICh wollt ja nur sagen das ich bei meinen Token vorallem das Konstruktor destruktor Problem hatte (unter anderen) und ich hab die Klassen von 3 auf 1 reduziert was dem code unglaublich geholfen hat; die lesbarkeit nicht wirklich zerstört hat!
Bei der klasse verwende ich auch ne virtuelle FUnktion, ganz einfach weil sichs für das Problem angeboten hat. Aber viele Leute verwenden sie halt nicht günstig und das verlangsamt den code auf jedenfall und das ist meiner meinung nach das problem mit c++!
Jedes mal wenn ich code irgendwo lese wo der schreiber für ne virtel seite code 4 Klassen verwendet wo man ganz einfach 1 machen könnte streubt sich bei mir alles.Also, ich hab nix gegen C++ und bin mir dessen bewusst, dass wenn man mit MSVC in c++ wie in c schreibt die gleichen ergebnisse erhält!
Meine Gründe die Engine in C zu schreiben hab ich ja auch erläutert oder? Ich schreib sie auch für einen Freund der in VB coded und dort tut er sich leichter mit einzellnen Funktionen denke ich
!
Fast hätt ichs vergessen!
mit cout und so! Wo ist das bitte stabiler?
und ist die klar was cout<<"hallo"<<" "<<"welt" für code produziert? Und was das für Speicher braucht?? Ich galub nicht sonst würds cout ned besser finden als printf() oder irr ich mich und red grad blödsinn?
(Kann ja mal vorkommen)
Nicht böse sein wenn ich n bissal gereizt kling aber ich will eigentlich n team finden und nicht seitenweise über meine Erfahrungen mit C++ und C berichten. Also könnten sich vielleicht auch ne paar leute melden die lust haben was zu coden
??
Ich hoffe es ist alles geklärt
Manuelh87
-
Wenn man kein absolutes Genie ist, entdeckt man bei "mehr high-level code" eher noch Schwachstellen im Algorithmus, als bei "low-level code".
Wenn ich so etwas habe:
typedef std::list<int>::const_iterator it; for( it i = myList.begin(); i != myList.end(); ++i ) sum += *i;
dann kann ich objektiv sagen, dass es nicht ganz so leicht zu überblicken ist wie:
foreach( int x in myList ) sum += x;
Natürlich ist es jetzt in beiden Fällen gut lesbar, aber man kann ja auch mal kompliziertere Schachtelungen haben. Wenn man das auf hunderttausende Zeilen Quellcode überträgt, dann kann man sich durchaus mal ein bisschen vertun und Chancen, den Algorithmus zu optimieren, erstmal verpassen. Und das tut mehr weh als die anderen Kleinigkeiten.
-
Richtig! Optimizer!
Genau so was mein ich
!!!
Endlich versteht mich einer!Ich wollt außerdem noch sagen, dass mann sich bei jedem code-schnipsel überlegen sollte wie der compiler das interpretieren wird. Also ich mach das oft! Leider kann ich asm nur lesen und nicht schreiben und kann daher meinen code hier nicht optimieren.
Ist sicher auch klar das der codeoptimizer bei dem comipler einiges ein shit code wieder geradebügeln kann, aber ich verlass mich halt nicht so gern auf solche Hilfstools!
Bsp: Bei meiner Engine hab ich n eigenartiges Logsystem und zwar ist überall ein #ifdef und #endif! So kann ich ganz easy die Logs ein und ausschalten (sind halt 2 builds!) und wisst ihr warum ich das nicht mit if(bLog==TRUE) mach????? na ? genau! weil das mindestens 2 Instructions sind die ich mir anders in der release version erspar (und neben bei auch in der anderen!!)
Also, es ist ned so das ich komplett keine Ahnung hab wie alle hier denken! Ich hab mich mit dem Zeug schon eingehend beschäftigt und nicht einfach NUR blödsinn gepostet (sicher auch n bissal aber nicht NUR
)
naja gut dann hoff ich weiter dass mal jemand wegen dem Projekt was posted!
(obwohl auch so ne disskusion sehr lehrreich ist)
cu Manuelh87
-
aber ich seh immer öfter das Leute ständig für jeden mist ne neue Klasse anlegen und ableiten usw... Und das verlangsamt den Code und zwar erheblich!!!
1. klassen sind genausoschnell wie structs+funktionen
2. vererbung muss den code garnicht verlangsamen, erst basisklassenzeiger zeigen spuren im laufzeitverhalten. unnötig zu erwähnen, dass in situationen, in denen man basisklassenzeiger benutzen muss, man auch in C enorme schwierigkeiten hat.
3. C++ istr nicht alles in Klassen steckenclass hat meistens nen Construktor! Bei Übergabe gibts dann noch nen Kopierkonstruktor usw. Das alles muss aber auch ausgeführt werden!
ein ctor Klasse(){} kostet garnichts. Wenn eine Klasse einen ctor braucht, so müsste eine gleichwertige structur auch eine funktion haben, die die werte setzt, bzw die werte werden von hand gesetzt, was die sache a) nicht schneller und b) nicht übersichtlicher macht.
(dasselbe gilt für den dtor)Und zwar performance gründe (und wer das nicht glaubt fragt google) und speicherplatzgründe!
meinst du die google ergebnisse, die mindestens 10 jahre alt sind?
Die Gefahr mit C++ ist meines erachtens dass ma klassen zu stark verwendet und der code darunter leidet weil viele c++ coder leider mehr keine ahnung von asm haben!
genau, jeder der asm kann, kann besseren code erzeugen als der compiler
.
Getter und Setter werden vom compiler sehr oft in 1-2 ASM befehlen abgehandelt, bei referenzrückgabe wird er aus dem getter wohl nur eine addresse machenBei der klasse verwende ich auch ne virtuelle FUnktion, ganz einfach weil sichs für das Problem angeboten hat. Aber viele Leute verwenden sie halt nicht günstig und das verlangsamt den code auf jedenfall und das ist meiner meinung nach das problem mit c++!
das problem an C++ ist,dass es so komplex ist, dass viele leute nicht wissen, wann man welche Sprachfeatures am besten einsetzt, und der code darum grottenschlecht ist.
mit cout und so! Wo ist das bitte stabiler?
genau da, wo man generischen code schreiben will
template<class T> void gibAus(T var){ cout<<var;//funktioniert mit jedem T } //mit printf template<class T> void gibAus(T var){ printf(%i,var);//was passiert wohl bei double... }
nebenbei gesagt, dass cout problemlos auch mit jedem objekt klarkommt, welches den op<< überladen hat, und somit eh besser zu nutzen ist als printf
und ist die klar was cout<<"hallo"<<" "<<"welt" für code produziert? Und was das für Speicher braucht
?? Ich galub nicht sonst würds cout ned besser finden als printf() oder irr ich mich und red grad blödsinn?
(Kann ja mal vorkommen)
das ganze verbraucht genau 11 Byte speicher("hallo welt"+\0), da der buffer aber nur eine sehr limitierte speicherkapazität hat(meines wissens nach 40Byte), fällt das sogut wie garnicht ins gewicht.
-
Bei dem meisten stimm ich dir zu aber
10 Byte???? bist du irreallein printf braucht sicher 500 byte!!!
Ich mein Stack nicht wie viel der String hat!!! da is n unterschied!! Und wenn du für jedes mal werte übergeben den Kopierkonstruktor aufrufs braucht das serwohl mehr speicher.
Mit dem Rest bin ich eigentlich einverstanden! Das mit den klassen und wie ich das mein ist ja anscheinend auch klar geworden und :
ich weiß schon das man mit c++ nicht nur klassen machen kann, es ist aber ein wesentlicher unterschied zu C. ICh mag C++ wegen der Freiheit alles zu machen: man kann asm, c und c++! (Das einzige was mich nervt sind typecasts wie long* auf void* aber das geht in C++ nicht anders wegen eindeutigkeit von funktionen und bla bla blaa...)Weiterhin stell ich die Frage ob den niemand an meinem Projekt interesse hat??
niemand??
wirklich niemand?*traurigsei*
:xmas1:
cu Manuelh87
-
und wisst ihr warum ich das nicht mit if(bLog==TRUE) mach????? na ? genau! weil das mindestens 2 Instructions sind die ich mir anders in der release version erspar (und neben bei auch in der anderen!!)
Auch das ist nicht so ganz richtig. Der Compiler ist durchaus in der Lage, Konstanten einzusetzen und if's entsprechend gleich richtig auszuwerten.
Du denkst zu low-level. Optimiere das, was der Compiler nicht kann (Algorithmen) und lass von dem anderen Zeugs die Finger.
IMHO kennst du dich damit noch nicht ausreichend gut aus und du unterschätzt außerdem die Compiler deutlich.Und bitte, verwende weniger Ausrufezeichen.
-
Manuelh87 schrieb:
aber ich seh immer öfter das Leute ständig für jeden mist ne neue Klasse anlegen und ableiten usw... Und das verlangsamt den Code und zwar erheblich!!!
Nein, tut es nicht. Dass das Arbeiten mit Klassen langsamer ist, war früher so. Aber damals gab es auch noch keine Compiler, die gut optimierten. Ich geb dir aber insofern recht, dass man es mit Klassen auch übetreiben kann.
Manuelh87 schrieb:
Es gibt serwohl nen unterschied zwischen class und typedef struct!!!
class hat meistens nen Construktor! Bei Übergabe gibts dann noch nen Kopierkonstruktor usw. Das alles muss aber auch ausgeführt werden!Richtig, eine Klasse hat immer einen copy-ctor (sofern der Compiler in der Lage ist einen zu erzeugen), und wenn du keine ctors selber definierst, auch einen default-ctor. Diese werden aber wegoptimiert, sofern sie nichts tun. Zumindest ein brauchbarer Compiler macht das so.
Manuelh87 schrieb:
In C dagegen wird nur ne Addresse gepusht! das is ne funktion vom cpu und geht schneller alles der jump zum Konstruktor und dann dort noch der ganze code!
Dies zeigt wirklich, dass du von C++ nicht allzu viel Ahnung hast. (nicht persönlich nehmen)
Manuelh87 schrieb:
Außerdem:
Hab ich ja nix gegen C++ und code auch meistens in C++ aber ich versuche wenige klassen zu verwenden! nur wenns wirklich sinnvoll ist! Ich code aber auch viel C (für TI) und es gibt gründe warum dort kein C++ gibt! Und zwar performance gründe (und wer das nicht glaubt fragt google) und speicherplatzgründe! Also erklärt mir nicht dauernd das das genau gleich ist! (Außer Beispiel oben)
Tatsächlich. OK, ich geb dir mal ein kleines Programm, davon kannst du ja mal die Geschwindigkeit testen (sekundengenaue Stoppuhr reicht
)
// C Version #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define LOOP_COUNT 100000 char s[5 * LOOP_COUNT + 1]; int main(void) { const char* add_strings[] = {"blah", "bleh", "blih", "bloh", "bluh"}; srand((unsigned int) time(NULL)); s[0] = '\0'; for (size_t i = 0; i != LOOP_COUNT; ++i) { strcat(s, add_strings[rand() % 5]); } printf("%c\n", s[rand() % (5 * LOOP_COUNT)]); return 0; } // C++ Version #include <iostream> #include <string> #include <cstdlib> int main() { const std::size_t LOOP_COUNT = 100000; const char* add_strings[] = {"blah", "bleh", "blih", "bloh", "bluh"}; std::srand(static_cast<unsigned int>(time(NULL))); std::string s; s.reserve(5 * LOOP_COUNT); for (std::string::size_type i = 0; i != LOOP_COUNT; ++i) { s += add_strings[rand() % 5]; } std::cout << s[rand() % (5 * LOOP_COUNT)] << std::endl; return 0; }
Ist wie gesagt alles eine Frage der Implementierung und der verwendeten Algorithmen.
Manuelh87 schrieb:
Die Gefahr mit C++ ist meines erachtens dass ma klassen zu stark verwendet und der code darunter leidet weil viele c++ coder leider mehr keine ahnung von asm haben!
Hast du dich mal gefragt warum das so ist? Nun ich sag es dir, Assembler ist plattformabhängig, C++ (wie auch C) nicht. Zudem macht es weniger Sinn am Code selbst (also mit Assembler Ersetzungen) zu optimieren, als an den verwendeten Algos.
Manuelh87 schrieb:
Bei der klasse verwende ich auch ne virtuelle FUnktion, ganz einfach weil sichs für das Problem angeboten hat. Aber viele Leute verwenden sie halt nicht günstig und das verlangsamt den code auf jedenfall und das ist meiner meinung nach das problem mit c++!
Noch ein Irrglaube. Rein assemblertechnisch besteht der Unterschied beim Aufruf einer virtuellen Funktion ja in folgendem
; normale Funktion call foo ; virtuelle Funktion mov eax, bar call [eax + xx]
Und das ist mittlerweile unerheblich. Dadurch heutige CPUs (x86-32/x86-64/ia64) mehrere Instruction-Pipelines besitzen kann durch entsprechende Code-Anordnung beides gleich schnell sein. Der einzige Nachteil von virtuellen Funktionen ist der, dass nicht geinlined werden kann. Aber wenn du in C++ eine virtuelle Funktion brauchst, dann brauchst du auch in C etwas vergleichbares.
Manuelh87 schrieb:
Also, ich hab nix gegen C++ und bin mir dessen bewusst, dass wenn man mit MSVC in c++ wie in c schreibt die gleichen ergebnisse erhält!
Darüber redet ja gar niemand, ich zumindest nicht. Siehe Bsp oben.
Manuelh87 schrieb:
Meine Gründe die Engine in C zu schreiben hab ich ja auch erläutert oder? Ich schreib sie auch für einen Freund der in VB coded und dort tut er sich leichter mit einzellnen Funktionen denke ich
!
Niemand sagt etwas dagegen, dass du deine Engine in C schreibst. Nur das mit Geschwindigkeit zu begründen ist überholt.
Manuelh87 schrieb:
Fast hätt ichs vergessen!
mit cout und so! Wo ist das bitte stabiler?Niemand hat von stabiler gesprochen. cout und co ist einfach typsicher, printf und co nicht. Bsp
int a = 10; printf("%s", a); // hoppla "%s" muesste ja eigentlich "%d" sein - das kriegst du aber erst mit, wenn dein Programm abstuerzt std::cout << a; // cout "erkennt" den Typ selbst, weiss also, dass es ein int und kein String ist char buf[16]; scanf("%s", buf); // hoppla, der Benutzer hat mehr als 15 Zeichen eingegeben und mein Programm stuerzt ab - was nun? std::string s; std::cin >> s; // kein Problem, der Benutzer kann Zeichen einlesen lassen, bis sein Speicher voll ist
Manuelh87 schrieb:
und ist die klar was cout<<"hallo"<<" "<<"welt" für code produziert? Und was das für Speicher braucht
?? Ich galub nicht sonst würds cout ned besser finden als printf() oder irr ich mich und red grad blödsinn?
(Kann ja mal vorkommen)
Ja, du redest Blödsinn. Mir ist schon klar, was der Compiler hier macht. Nur schreibt kein vernünftiger C++ Programmierer sowas. Wenn du die String Literale trennen willst, dann kannst du das auch so machen
std::cout << "hallo" " " "welt";
-
if auswerten vorzeitig???? Das kann ich mir beim besten willen nicht vorstellen. (Kein Ausrufezeichen
) => müsst ich mal probieren
(*nachdenk* sinnvoll wärs bei einem vergleich der sorte "const i=3; if(i==3)" schon aber ich weiß nicht ob das der lcc machen würd?)Dann stell ich dir noch ne frage: was ist besser compiler überschätzen oder unterschätzen?
Da bin ich nicht deiner Meinung. ICh finde es ist wichtig zu wissen was man coded und wie das dann nachher aussieht. Und beim lcc compiler schau ich mir die assemblys doch an.
cu Manuelh87
-
Manuelh87 schrieb:
if auswerten vorzeitig???? Das kann ich mir beim besten willen nicht vorstellen. (Kein Ausrufezeichen
) => müsst ich mal probieren
(*nachdenk* sinnvoll wärs bei einem vergleich der sorte "const i=3; if(i==3)" schon aber ich weiß nicht ob das der lcc machen würd?)Konstante Variablen werden in Release builds sowieso in den meisten fällen direkt vom Compiler durch den eigentlichen Wert ersetzt (besonders bei built-in typen), funktionieren also ähnlich wie #define's, sind aber typensicher.
Manuelh87 schrieb:
Dann stell ich dir noch ne frage: was ist besser compiler überschätzen oder unterschätzen?
Beides schlecht. Niemand hat behauptet, dass ein Extrem besser ist. Die beste Lösung ist, den Compiler richtig einzuschätzen. Dann kann man den Compiler nämlich den ganzen low-level Kram machen lassen (was ja auch zeitaufwändig ist) und sich selbst, wie schon einige andere geschrieben haben, eher auf geeignete Algos konzentrieren.
-
@otze und teileweise ach @andere
danke. genau das wollte ich auch sagen. leider war ich zu langsam.
ich kann dich gut verstehen. ich bin auch der meinung, das man ein wenig assembler können sollte, damit man versteht, was man macht.
deine argumente bezüglich geschwindigkeit scheinen mir aber nicht allgemeingültig zu sein. vielleicht hast du schlechte erfahrungen gemacht und jetzt eine falsche vorstellung davon wie schnell c++ wirklich ist.
bestimmt gibt es situationen wo c-code minimal schneller als vergleichbarer c++-code ist. aber sind solche vergleiche überhaupt wichtig? ich glaube nicht. man muss sich immer fragen was man will.
will man ein experte darin sein, die unterschiedlichen compiler und ihre übersetzungen von c/c++-code in maschinencode auswendig zu kennen, um somit maximal schnellen code schreiben zu können der im millionstelbereich schneller ist?
oder will man ein experte im coden von (game-) engines sein. da kommt es aber auf ganz andere dinge an, die die engine gut machen (siehe half life 2 und die physik simulationen). bei so komplexen berechnungen wie physiksimulationen spielen die paar takte, die klassen an der ein oder anderen stelle langsamer sind wirklich keine rolle mehr. das ist so, als ob man sich ein haus bauen will und sich gedanken darüber macht, ob der kleine kieselstein links vorne am teich richtig platziert ist :). eine (game-) engine muss viele features haben damit das spiel spass macht und einen beeindruckt. wenn das der fall ist, dann spielt es keine rolle, ob man im durchschnitt 120 (c++ grottenschlecht) oder 140 (c hackerstyle) fps hat, vorallme für diejenigen, die die engine überhaupt nicht kennen und sie nur "benutzen".
gruß
kx2