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
Zitat
Portabilität ist überhaupt erst der Grund wieso int gerade keine feste Größe hat;
Es war der Grund. Heutzutage gibt es praktisch keine Architektur mehr, die damit Schwierigkeiten hätte.
Sehr wohl gibt es aber unterschiedliche Ansichten auf der selben Architektur, woran die Größe der Typen bemessen werden kann.
Zitat von »dot«
erst recht ist es kein "Phänomen der Vergangenheit".
Dann nenn mir mal wenigstens eine aktuelle Architektur für die das nicht zutrifft.
Zitat von »dot«
int hat sowohl in C als auch in C++ eine ganz klar definierte Semantik und auch einen klar definierten Wertebereich.
Nö hat er nicht. Der C99-Standard und damit auch der C++11 Standard schreibt wortwörtlich nur folgende Dinge über den Wertebereich:
"minimum value for an object of type int INT_MIN -32767 // −(2 15 − 1)"
"maximum value for an object of type int INT_MAX +32767 // 2 15 − 1"
"A ‘‘plain’’ int object has the natural size suggested by the architecture of the execution environment"
"For any two integer types with the same signedness and different integer conversion rank, the range of values of the type with smaller integer conversion rank is a subrange of the values of the other type"
Ein int soll also mindestens so groß sein wie ein short oder ein signed char und der Größe entsprechen, die die Architektur vorschlägt.
Diese Aussage ist extrem vage und lässt viel Interpretationsspielraum für Entscheidungen nach Bedarf, Lust und Laune (Siehe Datenmodell). Insbesondere sind 32 Bit inzwischen eigentlich gar nicht mehr die native Größe der x64 Architektur.
Man könnte jetzt natürlich behaupten, dass die Typen trotzdem eine Semantik besitzen. Diese beschränkt sich aber auf sehr vage Formulierungen und deckt sich mit kaum einen Bedarf der Praxis. Ich wüsste beim besten Willen nicht in welchen Zusammenhang jemand einen Typ (int) brauchen könnte, der auf 32 Bit MSDOS 16 Bit groß ist und auf 32 Bit NT Windows 32 Bit. Oder ein Typ (long) der auf 64 Bit Windows 32 Bit groß ist und auf 64 Bit Linux 64 Bit. Das ist doch Schwachsinn.
Zitat von »dot«
Inwiefern der "long-Typ" "in der Praxis problematisch" sein soll entzieht sich gerade meiner Vorstellungskraft, aber ich kann dir mit Sicherheit sagen, dass, wenn die Präsenz von int dich in deinem Code zu "unnötigen Casts" zwingt, weil "nirgendwo was zusammenpasst", mit deinem Code was nicht ganz in Ordnung sein kann...
Du willst mir also sagen, dass du noch nie mit einer Bibliothek zu tun hattest, die falsche Annahmen zu long gemacht hat und ihn als 64 Bit angenommen hat?
Das kann ich mir irgendwie nicht vorstellen. Sogar der C-Standard selbst ist betroffen, indem zum Beispiel die C-Dateifunktionen wie ftell auf Windows nicht mit großen Dateien auskommen. Auf Windows muss man dann die Extension _ftelli64 verwenden. Soetwas finde ich ganz große Klasse. Diese Probleme haben ihren Ursprung in den falschen Annahmen über die Größe von Typen. Hätte man nicht einen eingebauten Typen verwendet sondern einen Typedef für den entsprechenden Bedarf, hätte es nie ein Problem gegeben. Die eingebauten Typen decken sich nunmal sehr selten mit dem Bedarf der Realität.
Zitat von »dot«
wenn die Präsenz von int dich in deinem Code zu "unnötigen Casts" zwingt, weil "nirgendwo was zusammenpasst", mit deinem Code was nicht ganz in Ordnung sein kann...
Bei der Verwendung im Zusammenhang mit Speicher als Indices oder Größenangaben, gibt es andauerend Casts in size_t oder ptrdiff_t.
Außerdem entstehen sie an allen Stellen, an dem Kontakt zur Außenwelt aufgenommen wird. Serialisierung oder WinAPI seien mal als Beispiele genannt.
Ich wüsste nicht wie solche Casts vermieden werden sollen. Die Ursache liegt einfach darin, dass ein Typ verwendet wird, der nicht dem tatsächlichen Bedarf entspricht.
Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »dot« (25.10.2015, 12:55)
Zitat von »Dot«
Dir ist klar, dass die Welt nicht nur aus PCs besteht und C und C++ als Systemsprachen insbesondere auch für Dinge wie Embedded Systeme gedacht sind, wo du teilweise 8-Bit CPUs vorfinden wirst...!?
Zitat von »Dot«
Und was genau ist daran unklar?
Zitat von »Dot«
Du kannst den Typ ganz ausgezeichnet verwenden wann immer du Ganzzahlen brauchst, die nicht größer als 32767 und nicht kleiner als -32767 sein müssen. Das tolle ist, dass du einfach int hinschreibst und es kompiliert sowohl für deinen 10 MHz 16-Bit RISC Mikrocontroller als auch für deinen superskalaren 4 GHz x64 Hexacore als auch für deine GPU mit 32-Bit Registern und 64-Bit Addressraum zu optimalem Code...
Zitat von »Dot«
aber wieso sollte man rein prinzipiell immer den mit der Garantie einer bestimmten Eigenschaft verbundenen Overhead herumschleppen, wenn selbige Eigenschaft für 90% des Code irrelevant ist?
Zitat von »Dot«
Könnte mich gerade nicht an einen solchen Fall erinnern. Rein prinzipiell: Wenn eine Bibliothek ungeeignete Datentypen verwendet, dann ist das ein Problem mit der Bibliothek und nicht ein Problem mit dem Datentyp...
Zitat von »Dot«
size_t und ptrdiff_t gibt es doch gerade erst genau für diese Dinge, wenn du irgendwo von einem size_t oder ptrdiff_t zurück nach int casten musst, dann liegt sehr wahrscheinlich wohl ein konzeptionelles Problem vor.
Zitat von »Dot«
Wenn ein Programmierer einen Datentyp verwendet, der "nicht dem tatsächlichen Bedarf entspricht", dann ist also der verwendete Datentyp schuld, weil er sich nicht an den Bedarf angepasst hat?
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Spiele Programmierer« (25.10.2015, 13:18)
Die Modelle kommen ja auch aus Dateien und wandern in OpenGL.
Das sind allerdings floats. In meinem Terrain-Renderer habe ich das Highfield als Festkomma. Das wird mit 32 Bit in einer Datei gespeichert und auch mit 32 Bit Ints an OpenGL geschickt.
Dort sehe ich zum Beispiel keinen Grund, warum ich im Zwischenschritt alles in einem Dateitypen umwandeln sollte, der in beide Richtungen inkompatibel ist.
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Wenn es egal ist, wie groß der Datentyp eigentlich ist, wie kommst Du da zu dem logischen Schluss, dass man ihn fest auf 32 Bit definieren müsste? Ist das nicht ziemlich unlogisch? Aus meiner Sicht ist das jedenfalls ein Widerspruch.Wie alt jemand sein kann, ist ja nicht davon abhänig wie groß ein Typ gerade bei einem bestimmten Compiler ist. Alter ist eine abstrakte Eigenschaft dessen Wertebereich meiner Meinung nach überall gleich sein sollte. Es ist ja nicht so, dass Leute die einen Linux Rechner(sizeof(long) == benutzen älter werden, als Leute die einen Windows Rechner benutzen (sizeof(long) == 4). Deshalb int32_t als Standard.
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Was? Vergleichst Du jetzt Äpfel mit Birnen? Mal ganz langsam. Eines ist ganze Zahl, das andere Fließkomma. Bitte, bitte, bitte sag mir nicht, dass nur Du deswegen einen 32-Bit-int genommen hast, weil Dir double zu groß, float unbekannt und Ganze Zahl oder Fließkomma pupsegal war.Zum Beispiel bei meinen Höhendaten, von denen ich vorher sprach war das ein wichtiger Teil für die Entscheidung für den Datentyp und es geht durchaus insgesamt um hunderte von MB, die gespart werden. Sonst hätte man ja auch double nehmen können.
Letzteres nicht, nein.Aber teilweise auch einfach Spieleprogrammierer und BlueCobolde, die mal einen schlechten Tag haben und mal versehentlich einen zu großen Wert zuweisen und das nicht bemerken.
Natürlich ist ein int Standard-konform. Sonst stünde er wohl kaum im C++ Standard.und dann einfach int nehmen. Schon ist es nicht mehr Standardkonform
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (25.10.2015, 14:13)
Zitat von »BlueCobold«
Was? Vergleichst Du jetzt Äpfel mit Birnen?
Zitat von »BlueCobold«
Eines ist ganze Zahl, das andere Fließkomma. Bitte, bitte, bitte sag mir nicht, dass nur Du deswegen einen 32-Bit-int genommen hast, weil Dir double zu groß, float unbekannt und Ganze Zahl oder Fließkomma pupsegal war.
Zitat von »BlueCobold«
Alter in Tagen? Jetzt wird's auch ernsthaft esoterisch und wirklich mal albern. Hast Du sonst noch ernsthafte Argumente für die Verwendung von int32_t?
Zitat von »BlueCobold«
Letzteres nicht, nein.
Zitat von »BlueCobold«
Natürlich ist ein int Standard-konform. Sonst stünde er wohl kaum im C++ Standard.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (25.10.2015, 21:20)
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (25.10.2015, 19:28)
Werbeanzeige