[C++] inline operator gegen pointer algorithmus

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Benutzeravatar
Brainsmith
Establishment
Beiträge: 109
Registriert: 04.09.2009, 13:52
Echter Name: Fabbo

[C++] inline operator gegen pointer algorithmus

Beitrag von Brainsmith »

Hallo,
ich stecke noch in den Kinderschuhen, was Engine-Programmierung betrifft. Jetzt bin ich da auf ein Problem gestoßen.
Es gibt mehrere Möglichkeiten ein "+" von Vektoren zu definieren.
Einmal eine Operation + innerhalb der Struktur Vector, außerhalb der Struktur
-mit und ohne "inline" Befehl.
Wann benutzt man eigentlich diesen inline befehl und wann nicht?


Andererseits kann man ja auch einfach drei Pointer auf Vektoren übergeben und gar keinen Rückgabewert definieren, sondern (unter der Annahme, dass ich die Vektoren a,b,c schon definiert habe) einfach:

Code: Alles auswählen

void add(vector* bla, vector* blubb, vector* blob){
blob->x = (blubb->x) + (bla->x);
blob->y = (blubb->y) + (bla->y);
blob->z = (blubb->z) + (bla->z);
};
// später in einer anderen Klasse dann:
add(&a, &b, &c);
Primär interessiert mich, welche Erfahrungen ihr bisher damit gemacht habt und warum ihr euch wofür entschieden habt.
Zuletzt geändert von Brainsmith am 10.01.2010, 13:47, insgesamt 2-mal geändert.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4858
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [C++] inline operator gegen pointer algorithmus

Beitrag von Schrompf »

Ich wollte bisher eigentlich Vektor-Mathematik immer implizit haben. Ich wollte also kein Add(ziel, a, b) tippen, wenn ich stattdessen auch ziel = a + b tippen kann. Wobei letzteres ohne einen guten Optimizer oder C++0x RValues ein Stück langsamer ist als die Add()-Lösung. Ist mir aber schnuppe, weil VC einen guten Optimizer hat. D3DX dagegen benutzt schon aus Gründen der API-Kompatibilität nur C - und da ist ein Syntax wie D3DXVectorAdd( ziel*, a*, b*) selbstverständlich. Allerdings bieten auch die D3DX-Strukturen für C++ Operator-Überladungen an.

Ob man dann die Operatoren in der Klasse oder extern definiert, ist zu gewissem Maße Geschmackssache. Ich habe Zuweisungsoperatoren wie =, += und sowas in der Klasse definiert, weil da immer *this verändert wird. Dagegen Operatoren wie Vec1 + Vec2 würde ich als externe inline-Funktionen schreiben, weil beide Vektoren dabei nicht verändert werden. Und bei Operatoren wie Matrix * Vektor ist sowieso klar, dass sie zu keiner der beiden Klassen wirklich dazugehören - daher sind die auf jeden Fall externe inline-Funktionen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Brainsmith
Establishment
Beiträge: 109
Registriert: 04.09.2009, 13:52
Echter Name: Fabbo

Re: [C++] inline operator gegen pointer algorithmus

Beitrag von Brainsmith »

Danke schonmal für deine schnelle Antwort. Das hat mir auf jeden Fall schonmal sehr geholfen.
Ich benutze Code::Blocks.. daher gehe ich mal davon aus, dass ich wohl eher auf die Pointer-Methode zurückgreifen werde.

Jetzt müsste ich nurnoch wissen, wann man inline-Befehle benutzt und wann nicht. Also eher eine generelle Frage.
Und viel wichtiger ist: Was ist denn der genaue Unterschied?

Falls ich es richtig verstanden habe, verbraucht der Operator ohne inline-Befehl mehr Speicher, da er jedes Mal neu instanziiert wird.
Beim inline passiert dies nur einmal..

Warum sollte ich also jemals auf den inline-befehl verzichten? Gibts da überhaupt einen Fall, wo es Sinn macht?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4858
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [C++] inline operator gegen pointer algorithmus

Beitrag von Schrompf »

Brainsmith hat geschrieben:Danke schonmal für deine schnelle Antwort. Das hat mir auf jeden Fall schonmal sehr geholfen.
Ich benutze Code::Blocks.. daher gehe ich mal davon aus, dass ich wohl eher auf die Pointer-Methode zurückgreifen werde.
Hier geht's erstmal nicht um Tempo, sondern um Code-Stil. Da ist die Pointermethode meiner Meinung nach nicht zu vertreten :-) Und wenn, dann nimm wenigstens const references und keine Zeiger.

Nebenbei: Code:Blocks benutzt den GCC. Und dessen Optimierer ist praktisch genausogut oder sogar besser als der von Visual C++. Es kann gut sein, dass auch der GCC die unnötige Zuweisung im Beispiel "c = a + b" komplett entfernen kann.
Jetzt müsste ich nurnoch wissen, wann man inline-Befehle benutzt und wann nicht. Also eher eine generelle Frage.
Und viel wichtiger ist: Was ist denn der genaue Unterschied?
Das dachte ich, hätte ich schon beschrieben: Ich benutze die klassen-externen Funktionen (sogenannte "freie Operatoren") immer da, wo die Operation die Parameter nicht verändert. Das ist aber nur Stilfrage, der vom Compiler erzeugte Code ist in beiden Fällen exakt derselbe. Du hast also die Wahl:

Code: Alles auswählen

class Vektor
{
  float x, y, z;

  const Vektor& operator += (const Vektor& v) { x += v.x; y += v.y; z += v.z; }
  Vektor operator + (const Vektor& derAndereVektor) const { return Vektor( x + derAndereVektor.x, y + derAndereVektor.y, z + derAndereVektor.z); }
};
oder halt

Code: Alles auswählen

class Vektor
{
  float x, y, z;
};

inline const Vektor& operator += (Vektor& ziel, const Vektor& quelle) { ziel.x += quelle.x; ziel.y += quelle.y; ziel.z += quelle.z; }
inline Vektor operator + (const Vektor& a, const Vektor& b) { return Vektor( a.x + b.x, a.y + b.y, a.z + b.z); }
Beide Varianten produzieren den selben Code und sind identisch zu benutzen. Es ist wirklich nur eine Stilfrage. Ich persönlich verpacke die Operatoren mit Zuweisung (wie hier im Beispiel das +=) in die Klasse, weil sie das Objekt verändern. Die symmetrischen Operatoren (wie hier + im Beispiel) formuliere ich dagegen meist als freie Operatoren.

Thema inline: das besagt nur, dass der Compiler nach Möglichkeit direkt den Code der Funktion vor Ort einfügen soll, anstatt einen Sprung zur Funktion einzubauen. Damit spart man sich den Overhead für die Parameterübergabe und sowas... mehr aber auch nicht. Das hat nur bei sehr kleinen Funktionen wirklich drastischen Nutzen, bei größeren Funktionen überwiegt der Aufwand für die eigentliche Ausführung der Funktion bei weitem. Gleichzeitig wird aber mit jedem Inline-Aufruf der Code etwas größer, weswegen man durch schlechtere Cache-Ausnutzung und sowas mit inlines sogar langsamer sein kann als ohne. Daher überlässt man die Entscheidung besser dem Compiler, das "inline" ist für den nur ein Hinweis, aber nicht bindend.

Bye, Thomas
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
jgl
Establishment
Beiträge: 109
Registriert: 08.04.2009, 08:58

Re: [C++] inline operator gegen pointer algorithmus

Beitrag von jgl »

Wieso eigentlich

Code: Alles auswählen

const Vektor& operator += (const Vektor& v) { x += v.x; y += v.y; z += v.z; }
und nicht

Code: Alles auswählen

Vektor& operator += (const Vektor& v) { x += v.x; y += v.y; z += v.z; }
?
Also aus welchen Gründen wird da noch ein "const" gesetzt?

MfG J...
Benutzeravatar
Schrompf
Moderator
Beiträge: 4858
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [C++] inline operator gegen pointer algorithmus

Beitrag von Schrompf »

jgl hat geschrieben:Also aus welchen Gründen wird da noch ein "const" gesetzt?
Geschmackssache. Ich finde halt, das Ergebnis einer "a += b"-Operation braucht nicht nochmal veränderlich zu sein. D.h., es geht immernoch

Code: Alles auswählen

 c = (a += b);
aber nicht mehr

Code: Alles auswählen

 a += b += c; 
Sind aber rein akademische Unterschiede - niemand bei Verstand würde sowas tippen wollen :-)
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8245
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] inline operator gegen pointer algorithmus

Beitrag von Krishty »

Hi,

Was die Operatoren + und += angeht, bietet es sich an, den Operator + so zu definieren, dass er den Kopierkonstruktor und den Operator += benutzt:

Code: Alles auswählen

Vektor operator + (const Vektor& derAndereVektor) const { return Vektor(*this) += derAndereVektor; }
Damit schreibt man Additionscode nur einfach statt doppelt (schnell ist es auch, weil namenlose lokale Objekte hervorragend optimiert werden können) – nützlich, wenn der Additionscode mal länger werden sollte (bei nicht-Zahlentypen oder wenn man mit SSE Gas geben will). Nun geht es aber weiter, definiert man den Operator + außerdem global:

Code: Alles auswählen

Vektor operator + (const Vektor & SummandA, const Vektor& SummandB) const { return Vektor(SummandA) += SummandB; }
Hier hat man es nun geschafft, auf keine Methoden der Klasse mehr zuzugreifen, außer dem Kopierkonstruktor und dem Operator +=. Zu einem Template umgeschrieben:

Code: Alles auswählen

template <typename T> T operator + (const T & SummandA, const T& SummandB) const { return T(SummandA) += SummandB; }
Hat man nun für JEDE seiner Klassen einen automatisch erzeugten Operator +, sobald diese Klasse auch einen Kopierk’tor und einen Operator += mitbringt. Man spart sich also auf lange Sicht die Hälfte des Codens (und wenn es speziell wird oder man keinen Operator + wünscht, kann man das Template ja immernoch spezialisieren).

Nur so als Tipp am Rande.

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Biolunar
Establishment
Beiträge: 154
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Re: [C++] inline operator gegen pointer algorithmus

Beitrag von Biolunar »

Meiner Meinung nach sollten so viele Funktionen wie möglich aus der Klasse rausgenommen werden, denn so wird die Klasse nach Außen hin viel flexibler. Prädestiniert sind hierfür natürlich Funktionen, die keine Invarianten der Klasse verändern. Das ermöglicht es u.U. später die Klasse zu erweitern ohne das Interface großartig ändern zu müssen. Vor allem für eine Bibliothek macht sich sowas enorm bezahlt, da es später meistens viel mehr Benutzer gibt, die alle unterschiedliche Bedürfnisse haben.
Dazu hatte ich doch mal einen tollen Artikel irgendwo *grml*... Wenn ich den finde, poste ich ihn :)

Für deine Operatoren empfehle ich außerdem mal einen Blick in Boost.Operators zu werfen.
Benutzeravatar
Brainsmith
Establishment
Beiträge: 109
Registriert: 04.09.2009, 13:52
Echter Name: Fabbo

Re: [C++] inline operator gegen pointer algorithmus

Beitrag von Brainsmith »

Vielen Dank für die vielen Antworten.

Also ich fasse mal zusammen:
Mit dem GCC macht es (von der Form mal ganz abgesehen) keinen Unterschied, ob ich Operatoren verwende oder Pointer-Algorithmen.
Operatoren sind allerdings schöner zu lesen und vereinfachen die Handhabung.
Operatoren sollten aus der Klasse/Struktur ausgelagert werden, falls möglich, damit die Klasse/Struktur nach außen hin flexibler wird.

Krishty hat geschrieben:Damit schreibt man Additionscode nur einfach statt doppelt (schnell ist es auch, weil namenlose lokale Objekte hervorragend optimiert werden können)
Komisch... Hier steht, dass es nicht gut zu optimieren wäre, wenn man ein unbenanntes Objekt benutzt.
Before talking about symmetry, we need to talk about optimizations to understand the reasons for the different implementation styles of operators. Let's have a look at operator+ for a class T as an example:

T operator+( const T& lhs, const T& rhs )
{
return T( lhs ) += rhs;
}

This would be a normal implementation of operator+, but it is not an efficient one. An unnamed local copy of lhs is created, operator+= is called on it and it is copied to the function return value (which is another unnamed object of type T). The standard doesn't generally allow the intermediate object to be optimized away:
Was denn nun? :)
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [C++] inline operator gegen pointer algorithmus

Beitrag von Aramis »

Der Standard sagt dies tatsächlich, natürlich auch. Es ist dem Compiler nicht einfach erlaubt IRGENDWAS wegzuoptimieren. Wenn der Optimizer aber in der Lage ist sicherzustellen dass seine Optimierungen das Verhalten des Programms nicht ändern, kann ihm und dir der Standard völlig egal sein. Also ausprobieren wie schnell es tatsächlich wird, falls das überhaupt eine Rolle spielt.

Die einzige vom Standard erlaubte Optimierung die das Programmverhalten ändern darf ist Return value optimization.
Benutzeravatar
Krishty
Establishment
Beiträge: 8245
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] inline operator gegen pointer algorithmus

Beitrag von Krishty »

Brainsmith hat geschrieben:Was denn nun? :)
Hat es Side-Effects, nicht. Hat es keine, darf es wegoptimiert werden. So genau kannte ich das selbst noch nicht, gut, dass du nachgeschlagen hast :)

Ich gehe stark davon aus, dass man in einer Vektor-Implementierung à la MMX-Register (im Gegensatz zu ::std::vector) keine Side-Effects hat – aber wenn du sichergehen willst, mach es, wie boost es zeigt. Im Grunde war meine Aussage ja auch: Fang nicht an, die Addition von Hand im Operator + durchzuführen, sondern ruf den Operator += auf – ob per unbenannter oder benannter Kopie, ist deine Entscheidung.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Biolunar
Establishment
Beiträge: 154
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Re: [C++] inline operator gegen pointer algorithmus

Beitrag von Biolunar »

Hanno
Beiträge: 25
Registriert: 28.02.2009, 14:15

Re: [C++] inline operator gegen pointer algorithmus [gelöst]

Beitrag von Hanno »

Den Artikel kenn ich auch. Was er allerdings nicht beachtet (wenn ich mich richtig erinnere, hab ihn jetzt nicht nochmal gelesen) ist Testbarkeit des Codes. Member-Funktionen kann man per Mock-Objekt ersetzen. Bei Methoden außerhalb einer Klasse hat man diese Möglichkeit nicht (zumindest wüsste ich nicht wie), was das Schreiben von Unit Tests behindert.
Benutzeravatar
Brainsmith
Establishment
Beiträge: 109
Registriert: 04.09.2009, 13:52
Echter Name: Fabbo

Re: [C++] inline operator gegen pointer algorithmus [gelöst]

Beitrag von Brainsmith »

Danke allerseits für die vielen Infos.

Eins interessiert mich dann doch noch. Was sind Mock-Objekte und Unit-Tests?
Benutzeravatar
Ingrater
Establishment
Beiträge: 103
Registriert: 18.04.2007, 21:52

Re: [C++] inline operator gegen pointer algorithmus [gelöst]

Beitrag von Ingrater »

Du könntest außerdem für vektoren noch SSE Instruktionen verwenden. Das würde dann z.b. so aussehen.

Code: Alles auswählen

    inline const vec4 operator + (const vec4& v) const{
      vec4 res;
      res.m = _mm_add_ps(this->m,v.m);
      return res;
    }
Allerdings musst du dann auch den new und delete operator überladen um 16byte ausrichtung zu erreichen. Zudem brauchst du ein 16byte alignment flag am ende der struktur sodass auch auf dem stack angelegte instanzen 16byte ausgerichtet sind. Außerdem muss man dann noch aufpassen dass klassen und strukturen die vekotren als member haben wiederum 16byte ausgerichtet sind und die vektoren am anfang stehen. Der ganze aufwand lohnt sich aber. Vorallem funktionen mit vielen Vektoroperationen werden wesentlich schneller. Falls interesse besteht kann ich dir meine vektor + matrix klassen als source schicken.
Hanno
Beiträge: 25
Registriert: 28.02.2009, 14:15

Re: [C++] inline operator gegen pointer algorithmus [gelöst]

Beitrag von Hanno »

Brainsmith hat geschrieben:Was sind Mock-Objekte und Unit-Tests?
Ein Unit Test ist ein automatisierter Test, der eine bestimmte Code-Einheit, z.B. eine Methode oder eine Klasse testet. Im Gegensatz zu anderen Arten von automatisierten Tests (Integrationstests, die Gruppen von Klassen testen und Systemtests, die ein komplettes Softwaresystem testen) sollen Unit Tests eine bestimmte Klasse/Methode in Isolation testen.

Ein Beispiel:
Du hast eine Klasse, die irgendwas (von mir aus Accounts von einem Online-Spiel) verwaltet und diese in einer Datenbank abspeichert. Du möchtest einen Unit Test schreiben, der sicherstellt, dass dein Account-Manager keinen Accountnamen zulässt, den es schonmal gibt.
Ein Unit Test soll, wie gesagt, ein bestimmtes Stück Code in Isolation testen. Wenn dein Account-Manager während des Tests in eine echte Datenbank schreibt bzw. aus ihr liest, dann ist es kein Unit Test mehr. Dafür gibt es dann Mock-Objekte.

Um bei dem Beispiel zu bleiben: Anstatt deinen Account-Manager während des Tests auf ein echtes Datenbank-Objekt zugreifen zu lassen erstellst du ein Mock-Objekt, dass nur so tut wie eine Datenbank, sich aber genau so verhält wie du es ihm vorher gesagt hast. Mock-Objekte kann man entweder manuell erstellen (z.B. durch ableiten deiner Datenbank-Klasse oder implementieren eines Datenbank-Interfaces) oder das von einer entsprechenden Bibliothek automatisch machen lassen.
Benutzeravatar
Brainsmith
Establishment
Beiträge: 109
Registriert: 04.09.2009, 13:52
Echter Name: Fabbo

Re: [C++] inline operator gegen pointer algorithmus [gelöst]

Beitrag von Brainsmith »

Krishty hat geschrieben:Damit schreibt man Additionscode nur einfach statt doppelt (schnell ist es auch, weil namenlose lokale Objekte hervorragend optimiert werden können) – nützlich, wenn der Additionscode mal länger werden sollte (bei nicht-Zahlentypen oder wenn man mit SSE Gas geben will). Nun geht es aber weiter, definiert man den Operator + außerdem global
Eines interessiert mich dann aber doch. Ich würde natürlich gerne schnelle Operatoren schreiben. Dies betrifft jetzt insbesondere Matrizen.
Dazu hab ich im Internet gelesen, dass CPUs gewisse Features wie SSE haben..
Jetzt finde ich aber dazu keine Quellen, wie man beispielsweise SSE3 benutzt. Kennt sich jemand damit aus?
SSE3 kann ich doch auf neueren Computern als gegeben ansehen, oder?
Benutzeravatar
Krishty
Establishment
Beiträge: 8245
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] inline operator gegen pointer algorithmus [gelöst]

Beitrag von Krishty »

Brainsmith hat geschrieben:Eines interessiert mich dann aber doch. Ich würde natürlich gerne schnelle Operatoren schreiben. Dies betrifft jetzt insbesondere Matrizen.
Dazu hab ich im Internet gelesen, dass CPUs gewisse Features wie SSE haben..
Jetzt finde ich aber dazu keine Quellen, wie man beispielsweise SSE3 benutzt. Kennt sich jemand damit aus?
SSE3 kann ich doch auf neueren Computern als gegeben ansehen, oder?
Naja, kommt immer darauf an, was deine Zielgruppe ist. Welche Features von welcher SSE-Version unterstützt werden, steht im zugehörigen Wiki-Artikel, ob du diese Hardware bei deinen User voraussetzen kannst, ist allein deine Entscheidung.

Nun ist es aber so, dass außerdem dein Compiler SSE-Support bieten muss (mit VS 2008 geht das afaik nur bis SSE2). Du kannst aber auch gegen Bibliotheken linken, die von sich aus Gebrauch von SSE machen – da wären XNA Math von Microsoft (enthalten im DirectX SDK) oder die Core Math Library von AMD (und noch viele weitere). Wenn du in VS SSE-Code von Hand produzieren willst, musst du Intrinsics benutzen. Aus deren Headern bekommst du auch die Datentypen, die du benutzen solltest, um auf parallelen Datentypen zu arbeiten. Afaik bietet z.B. Intel dafür Papers, wo du sehr schnellen Matrizen-Code nurnoch abzukopieren brauchst.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Brainsmith
Establishment
Beiträge: 109
Registriert: 04.09.2009, 13:52
Echter Name: Fabbo

Re: [C++] inline operator gegen pointer algorithmus

Beitrag von Brainsmith »

Also ich benutze den GNU GCC, der, soweit ich das jetzt gesehen habe, auch SSE3 unterstützt und mittlerweile CodeBlocks, um eine .Net-Abhängigkeit zu verhindern. ^^
Ich möchte eine Engine schreiben, die einfach nur in ein Echtzeitstrategiespiel eingebaut werden soll (irgendwann mal ^^).. Das Spiel wird wahrscheinlich dann eh mindestens einen Pentium 4 voraussetzen. Die Frage war nur so gemeint, ob ich damit die Latte nochmal ne Nummer höher drücke, oder nicht. ^^
Benutzeravatar
Krishty
Establishment
Beiträge: 8245
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] inline operator gegen pointer algorithmus

Beitrag von Krishty »

Solange das Transformieren von abermillionen Vektoren pro Frame nicht Hauptaufgabe des Spiels ist, kannst du die Latte beruhigt wieder runter ziehen … dass Vektormathe der Bottleneck eines Games ist, ist wirklich sehr selten … und selbst wenn, ist eine Third-Party-Mathe-Lib die bessere Wahl. Für das halbe Prozent Performance-Plus lohnt sich der Aufwand einfach nicht.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [C++] inline operator gegen pointer algorithmus

Beitrag von Aramis »

Lass den Compiler die Optimierung machen und verzichte auf das Gefummel mit manuellen SSEn-Intrinsics oder Inline-Assembler. Autovektorisierung ist eine Paradedisziplin für Optimizer die insbesondere in CPU-Benchmarks eine Menge rausholt, daher legen die Compiler auch mit jeder Version zu. Du kannst vielleicht für ein Jahr besseren Code schreiben, aber irgendwann wirst du dann doch wieder überholt, musst deinen Code auf noch neuere Befehlssatzerweiterungen optimieren. Wenn, dann mach sowas ganz am Ende der Entwicklung, wenn du durch sauberes profilen feststellst dass du tatsächlich genau *daran* hängst ... premature optimization is the root of all evil.

PS: Ich nutze glm und bin ziemlich zufrieden damit. Mathecode selber zu tippen ist mir zu fehleranfällig und viiiel zu zeitaufwändig.
Benutzeravatar
Brainsmith
Establishment
Beiträge: 109
Registriert: 04.09.2009, 13:52
Echter Name: Fabbo

Re: [C++] inline operator gegen pointer algorithmus

Beitrag von Brainsmith »

Ja, da wirst du recht haben.. habe jetzt erstmal "ganz normale" Martixoperatoren geschrieben. Am Ende werde ich dann vielleicht SSE implementieren..

Bei mir ist das so. Ich bin recht neu in C++, will aber eine 3DEngine schreiben. Ich gehöre zu einer kleinen Gruppe von Leuten, die ein Echtzeitstrategiespiel machen wollen. Die Herausforderung ist, absolut alles selber zu programmieren. Es geht mir persönlich nicht wirklich um die allerbeste Lösung. Allerdings will ich das, was ich mache, gut machen. Ich kopiere, soweit wie möglich, keine Codes und versuche das, was ich tue, zu verstehen. Deshalb kommen wahrscheinlich noch häufiger solche Fragen. Irgendwie muss man ja mal anfangen. ^^
Danke für die vielen Antworten und eure Geduld
Antworten