Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

S4My

unregistriert

41

10.06.2012, 00:46

Ja dot, jetzt bin ich mit meinem Latein am Ende...um bald 1 Uhr fällt mir auch nichts mehr ein. Vielleicht noch abschließen, wenn man auch bei short auf jeden Rechner aufpassen muss und das bei int genauso ist, wieso sollte ich dann int short vorziehen. Mein Beispiel vorhin bezog sich auf den Fall das int den selben Wertebereich wie short annimmt.
Außerdem wäre ich erfreut wenn man mir einen Rechner zeigt der tatsächlich 1000 Asteroiden mit ihren eigenen Flugbahnen und Eigenschaften rendern kann...irgendwo sind die Argumente dann doch sehr auf den Fall eines unglaublichen Computers ausgelegt...

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

42

10.06.2012, 01:01

Also mir ist lieber, wenn das ganze Spiel sofort beim entsprechenden new mit einem std::bad_alloc abschmiert und ich den Bug fixen kann, als dass ich meine Bugs nur durch Aufpassen, Glück und Unit Tests finden kann, weil sie sich nicht bemerkbar machen... ;)

Muss ja nicht unbedingt direkt abschmieren, kann sich ja auch erstmal mit gähnender Langsamkeit festfressen... ;)
Also ich fisch den Bug lieber durch einen unittest raus, anstatt paranoider Weise nur noch einem Datentyp zu vertrauen und überall einfach int hin zu schreiben (zumal nicht einmal mit einem unsigned, weil's ja unpassend ist). Das klingt für mich nach Java Direktive: einfach int nehmen, dann passt schon alles.

Aber wie schon gesagt: hier trennen sich die Meinungen: du gehst lieber auf Nummer sicher und für das alltägliche benutzt du Standardmäßig int, wenn es nicht anders sein muss.
Und ich denk nun einmal lieber nach _was_ da passender ist. Ich bin im Einklang mit meinem Code sozusagen.
Ich versuch mich dann damit mal aus der Diskussion auszuklinken, bringt eh nicht mehr viel, Meinungen wurden von allen Seiten genannt. :)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

43

10.06.2012, 01:05

Du verstehst mich falsch. Ich hab nie gesagt dass man einfach nur noch int nehmen soll. Im Gegenteil, ich seh das genau wie du, nämlich dass man nachdenken und nehmen soll was am passendsten ist. Die Sache ist einfach die, dass Dinge wie short oder byte imo einfach sehr selten tatsächlich die passenden Typen sind. Für die genannten Beispiele wären sie das imo z.B. nicht...

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

44

10.06.2012, 01:40

Du verstehst mich falsch. Ich hab nie gesagt dass man einfach nur noch int nehmen soll. Im Gegenteil, ich seh das genau wie du, nämlich dass man nachdenken und nehmen soll was am passendsten ist. Die Sache ist einfach die, dass Dinge wie short oder byte imo einfach sehr selten tatsächlich die passenden Typen sind. Für die genannten Beispiele wären sie das imo z.B. nicht...

Um die Beispiele ging's mir ja.
Bei Binärdaten sagtest du ja würdest du sie anwenden, allerdings hatte ich sonst keine Beispiele von dir gehört.
Für mich reicht es eben wenn ich weiß dass ich nur ein bestimmten Range brauche. Dann nehme ich auch nur den. Ist irgendwie drin.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

45

10.06.2012, 13:40

Bei Binärdaten sagtest du ja würdest du sie anwenden, allerdings hatte ich sonst keine Beispiele von dir gehört.

Naja, mir fallen eben sonst auch kaum Beispiele ein. ;)

Für mich reicht es eben wenn ich weiß dass ich nur ein bestimmten Range brauche. Dann nehme ich auch nur den. Ist irgendwie drin.

Ja, natürlich. Nur sollte dir eben bewusst sein, dass du dadurch in der Regel nichts gewinnst, möglicherweise aber etwas Performance verlierst. Eben aus Gründen wie z.B. dass der Zugriff langsamer wird oder dass es potentiell langsamer ist, mit Teilen eines Registers zu arbeiten als mit dem ganzen Register etc.
Normalerweise ist das alles natürlich völlig irrelevant und der Compiler wird beispielsweise mit short in den meisten Fällen auch praktisch den selben Code erzeugen wie mit int, außer eben z.B. wenn gewisses Verhalten bezüglich Underflow/Overflow usw. sichergestellt sein muss.
Auf der anderen Seite kann man mit short unter gewissen Umständen natürlich tatsächlich was gewinnen, wenn man z.B. mehr Daten in den Cache bringt und dieser Vorteil das Misalignment wettmacht. Das sind dann aber alles Optimierungen für konkrete Anwendungsfälle, eben genau solche "speziellen Anforderungen", wo die Verwendung anderer Typen dann tatsächlich Sinn macht...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (10.06.2012, 13:48)


Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

46

10.06.2012, 13:47

Dessen bin ich mir bewusst. Mir geht es ja auch nicht um den Performance Gewinn oder irgend eine Optimierung, sondern einfach das es intuitiv korrekter ist einen passenden Datentyp zu wählen.
Welche Vorteile das hat bzw. inwiefern es das nachdenken über die eigentliche Sache fördert soll jetzt hier gar nicht weiter diskutiert werden. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

47

10.06.2012, 13:53

Ja, nur ich finde eben nicht, dass jetzt z.B. ein short für ein Alter "intuitiv korrekter" wäre als ein int...

Aber nun gut, da haben wir offenbar stark eine unterschiedliche Intuition ;)

S4My

unregistriert

48

10.06.2012, 13:53

Ok, gestern habe ich mich sehr wortkarg gegeben, das tut mir leid. Falls es noch jemanden interessiert würde ich versuchen mich jetzt ein wenig besser auszudrücken.

Nun der Link. Er führt zu einer Seite in der in einem Absatz Vorteile wie auch Nachteile verketteter Listen in Verwendung mit Spielobjekten besprochen werden. Zwar nicht ganz hiermit vergleichbar, jedoch von der Sinnhaftigkeit ähnlich, da es auch um Verwendung gewisser Datentypen und deren Begrenzung und Flexibilität geht. Kurz und kapp:

Zitat

...Man stelle sich ein 3D-Szenario vor, in dem einige Asteroiden platziert werden sollen. Was spricht dagegen, eine Obergrenze für deren Anzahl festzulegen? Aus Performancegründen können sowieso nicht beliebig viele Objekte animiert und gerendert werden. Speicherverschwendung ist das auch nicht, wenn man davon ausgeht, dass zu irgendeinem Zeitpunkt die Obergrenze erreicht wird...

Es ist eben genau dieser Punkt. Aus Performancegründen macht es keinen Sinn Tausende an Feinden oder was auch immer zu erzeugen und dann bei jedem Frame den sie noch bestehen auch wieder zu rendern. Wieso sollte man hier also nicht auf kleinere Datentypen zurückgreifen.

Was dann das Thema hier betrifft:

C-/C++-Quelltext

1
typedef short int16

Das war ja noch nicht alles, man könnte ja genauso gut auch folgendes deklarieren:

C-/C++-Quelltext

1
typedef long int32

Der Gedanke, oder zumindest mein Gedanke dahinter war, dass man so zwar noch immer nicht garantieren kann, dass ich nun wirklich Integer der Größe 16 und 32 Bit verwende, jedoch genauer schätzen kann in welche Richtung das ganze gehen wird.
Wie ich bereits geschrieben habe ist es allgemein ja so:

char <= short <= int <= long

Für mich erschließt sich daraus, sofern man davon ausgeht das der kleinste Datentyp immer noch 8 Bit besitzt, da ja selbst bool welcher im Prinzip nur 1 Bit bräuchte 8 Bit besitzt, dass ich mit der Verwendung des oben definierten Typs int16 mindestens die Zahl 125, wenn ich das ganze unsigned mache 255, speichern kann. Gleichermaßen kann ich durch int32 davon ausgehen den größt möglichen Typ zu verwenden.
Mir ging es also weniger um die eigentlichen Werte sondern um die Relationen, welche sich durch gewisse Dinge einfach besser einschätzen lassen. Verwende ich normale Integer so gibt es weitaus mehr Richtungen: Der Rechner könnte dafür sorgen das diese Variable der short gleicht, aus dem ergibt sich das Integer klein wenn nicht sogar der kleinste Datentyp ist, also möglicherweise nur 8 Bit speichern kann. Auf der anderen Seite könnte int dem in der Liste größten Datentyp gleichen, was wiederum heißt ich könnte viel mehr speichern als eigentlich vorgesehen. Je nach dem was nun zutrifft kann es zu Fehlern kommen.
Es wäre also eine Überlegung Wert int anders zu definieren, damit ich von Haus aus schon gewisse Rahmen einhalte bei der Verwendung. Mir wäre der reine Gebrauch nämlich zu variabel.

Für mich ist das ganze auch hilfreich was Portabilität angeht. Gibt man diesen Begriff bei Google ein so erhält man als erstes eine Wikipediaverzweigung, die gleich zu Anfang die Plattformunabhängigkeit verlinkt. Nun ist es, wie oben schon niedergeschrieben, leichter Datentypen welche nicht der Architektur des Rechners entsprechen sollen einzuschätzen. Zumindest sehe ich das so.

Jetzt noch die Wiederverwendung gewisser Programmabschnitte. Für mich ist es so, ein Programm soll seinen Zweck so gut wie möglich erfüllen und nicht in gewissen Dingen Kompromisse eingehen weil ich möglicherweise Code später wiederverwenden möchte. Wenn das dann der Fall ist, so sollte ich sowieso noch einmal durch den Quelltext gehen und sehen ob alles wirklich stimmt, es sei den dieser besondere Code wurde von Anfang an schon so geschrieben, dass er auch wirklich überall einsetzbar ist.

Naja, das sind zumindest meine Ansichten. Von irgendwelchen Optimierungen will ich hier nicht reden, das ist ja auch nicht der Sinn dahinter, es geht mir nur um die bessere "Kontrolle" über meinen Programmcode.

Mlg
S4My

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

49

10.06.2012, 13:59

"Intuitiv korrekt" ist ja sowas von subjektiv, da kann man auch gleich sagen, dass man irgendwas tut, weil der Himmel blau besser aussieht als grau. Es ist aber in praktisch allen Fällen eine sehr dumme Idee, kleinere Datentypen als int zu nutzen. Wenn man definitiv nur positive Werte haben will (Array-Index, Speichergröße und sowas), nimmt man halt unsigned int. Oder, um auch auf 64Bit-Maschinen den natürlichen Typ für Speichergrößen u.ä. zu nutzen: size_t. Und wenn man sich jetzt mal die C++-Standard-Lib anschaut, stellt man fest, dass schlauere Leute als wir das schon vor Jahrzehnten begriffen haben und std::vector usw. schon size_t nutzen.

Die einzigen Fälle, in denen ich short/char usw. nutze, ist bei Arrays, die aus verschiedenen Spezial-Erwägungen heraus unbedingt sehr kompakt sein sollen.

Zitat

Wieso sollte man hier also nicht auf kleinere Datentypen zurückgreifen.

Weil es langsamer ist, man ansonsten nichts gewinnt, und in zwei Jahren potentiell DOCH mehr als 1000 Asteroiden darstellen kann? Ich finde diese Begründung zum Haare-Raufen.

Warum sollte man eine Obergrenze für die Anzahl gleichzeitig existierender Feinde festlegen? Warum? Ein Feind mehr und das Array explodiert? Ja, aber nur, wenn man so blöd war, ein statisches Array anzulegen. Alles andere wird einfach nur ein Minimum langsamer, wenn man anstatt 1000 Feinden jetzt 1000 und einen hat. Und in ein paar Monaten fällt Dir vielleicht eine clevere Optimierung ein und plötzlich kannst Du 2000 Feinde gleichzeitig haben. Schreibst Du dann jede Ecke um, die was mit Feinden macht? Oder freust Du Dich einfach nur und nutzt die neuen Möglichkeiten?

Ich kann's nicht glauben, dass ich zu solchem Unsinn tatsächlich meine Zeit mit schreiben verschwende.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Schrompf« (10.06.2012, 14:05)


Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

50

10.06.2012, 14:09

Zitat


Ich kann's nicht glauben, dass ich zu solchem Unsinn tatsächlich meine Zeit mit schreiben verschwende.

Hättest es ja lassen können. :)

Für mich ist hier Schluss, hab das Gefühl jetzt wird nur noch geflamed. Danke an dot hierbei, schöne Diskussion, hat mich ein wenig angeregt nochmal drüber nachzudenken. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige