Du bist nicht angemeldet.

Werbeanzeige

S4My

unregistriert

21

09.06.2012, 23:28

Na da geht doch schon etwas ab wenn man hier eine Kleinigkeit von sich gibt ^^ .

So, um mich zu erchtfertigen:

Der C++ Standard legt nur gewisse Mindestgrenzen fest. short ist genauso "vom Rechner abhängig" wie int.
Das mag schon sein. Der Standard legt fest welche Mindestgrößen einzuhalten sind. Das sieht dann ungefähr so aus:

char <= short <= int <= long

Natürlich besteht hier auch eine Rechnerabhängigkeit. Bei den Integer Variablen ist dies jedoch weitaus gravierender als bei den anderen.

Diese Regel wär mir neu. Entsprechende typedefs (wie z.B. std::uin32_t etc.) gibt's bereits in <cstdint>. Und sowas braucht man nur in Code, der tatsächlich davon abhängig ist, dass ein Integer eine ganz bestimmte Anzahl an Bits hat.
So, zuerst einmal zu der Regel. Ich habe hier einen dicken Welzer vor mir liegen der da, wenn auch ein wenig peinlich, heißt: "C++ Lernen und profesionell anwenden", erschienen bei mitp in der 5.Auflage. An dieser Stelle muss ich leider sagen, ich Schussel habe mich die ganze Zeit mit den Bits geirrt :dash: , mit 32-bit wollte ich eigentlich 16 Bit Rechner beschreiben. Naja, du hast hier selbstverständlich recht. Allerdings ist auf Doppelseite 38 deutlich zu lesen das Integer exakt der Länge des Maschinenregisters entspricht, somit variabel und auf gewissen Rechner, welche heute seltener auftreten, kleiner als auf anderen. Diese Eigenschaft besitzt keine der anderen Variablen. Aber danke fürs ausbessern :D .

Trotzdem ist das kein geeigneter Weg um auszudrücken, dass ein Wert nur einen bestimmten Bereich haben darf. Denn ich kann deinem short trotzdem einen viel höheren Wert zuweisen. Nichts hindert mich daran und das Ergebnis ist in jedem Fall wohldefiniert.
Nun ja, ich habe nichts der gleichen geschrieben. Die Verwendung der Variable short soll keineswegs zeigen das eine Variable nur einen bestimmten Wert haben darf. Das wäre relativ Sinn frei, gebe ich zu. Das man größere Werte zuweisen kann ist natürlich selbstverständlich. Meine Frage wäre jetzt nur der Grund warum man das tun sollte. Wir sind hier in einem Forum welches Spieleprogrammierer und solche die es gerne wären, jetzt darf man raten zu welcher Gruppe ich gehöre ;) , beherbergt. Gerade hier sollte man wissen, dass es zwecks Performance schon keinen Sinn ergibt ewig lange Werte abzuspeichern.
Ich habe noch kein Spiel gesehen in dem der Spieler über 4 Milliarden Lebenspunkte verfügt oder auf einen Schlag 2 Millionen Asteroiden auf in hereindonnern. Vielleicht bin ich auch einfach nur blind, jedoch erschließt sich mir an dieser Stelle nicht ganz wieso man dazu keine kleineren Variablen nehmen sollte. Ich kann auch nicht aus Erfahrung sprechen, jedoch erscheint es mir ein wenig schlecht durchdacht sollte man nicht einschätzen können welche Werte eine Variable aufnehmen muss und man deshalb lieber Integer nimmt anstatt kleinere, welche wahrscheinlich genauso gute Arbeit leisten würden. Klar gibt es Ausnahmen, aber die Ausnahme zur Regel machen?

Nun gut, mit Ruhm habe ich mich nicht bekleckert, aber ich denke es gibt schon einige Argumente welche für die Verwendung anderer Variablen sprechen. Mir viele einmal die ach so gefürchtete Portabilität ein. Ich kann durch die typedef-Methode sicherstellen das mir das Maschinenregister keinen Strich durch die Rechnung macht. Ob das so schlecht ist wage ich zu bezweifeln.

Mlg
S4My

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

22

09.06.2012, 23:43

Natürlich besteht hier auch eine Rechnerabhängigkeit. Bei den Integer Variablen ist dies jedoch weitaus gravierender als bei den anderen.

Was genau vermittelt dir diesen Eindruck?

Allerdings ist auf Doppelseite 38 deutlich zu lesen das Integer exakt der Länge des Maschinenregisters entspricht, somit variabel und auf gewissen Rechner, welche heute seltener auftreten, kleiner als auf anderen. Diese Eigenschaft besitzt keine der anderen Variablen.

Das stimmt so leider nicht. Auch wenn im Standard steht dass int der "natürlichen Größe der jeweiligen Architektur" entsprechen soll, steht dort nichts von Registern oder sonstwas. Selbst wenn du dir einfach nur x64 anschaust, trifft das im Allgemeinen nicht zu (ein int ist dort in der Regel 32bit groß).

Gerade hier sollte man wissen, dass es zwecks Performance schon keinen Sinn ergibt ewig lange Werte abzuspeichern.

Wieso genau ist das denn deiner Meinung nach so?

Mir viele einmal die ach so gefürchtete Portabilität ein. Ich kann durch die typedef-Methode sicherstellen das mir das Maschinenregister keinen Strich durch die Rechnung macht.

Was genau willst du damit sagen?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (09.06.2012, 23:50)


FSA

Community-Fossil

  • Private Nachricht senden

23

09.06.2012, 23:50

@dot: Du hast dich selbst zitiert :crazy:

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veralteten strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

24

09.06.2012, 23:50

@dot: Du hast dich selbst zitiert :crazy:

thx, fixed ;)

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 490

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

25

10.06.2012, 00:11

Nun, ich bleib dabei, als einer der wenigen Verfechter der "durchdachten" Anwendung von Datentypen.
Wenn ich möchte das in meinem Spiel nur maximal 255 Asteroiden erscheinen, nehme ich ein ubyte bzw unsigned char, wenn wir mal bei C++ bleiben. Warum? erstmal: unsigned: Ich werde nie negativ viele Asteroiden haben, allein intuitiv daher unsigned.
Wieso byte/char? Weil selbst wenn ich mal eine endlos loop oder dergleichen habe, wie bspw. einen viel zu großen Wert zuzuweisen, bleibt es im Range von 0 - 255. Es kann nicht passieren, dass ich durch irgendeinen Fehler oder nicht bedachten Fall auf einmal 4 Milliarden rumschwirren habe und mein ganzer Rechner in die Knie gezwungen wird.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

S4My

unregistriert

26

10.06.2012, 00:13

Ich glaube ich gebe langsam auf... :dash:

Was mir den Eindruck vermittelt...mir persönlich reicht die Tatsache, dass Integer sich von Haus aus mehr an die Eigenheiten des Rechners anpassen sollen, wenn das keine gute Argumentation ist so tut es mir wirklich leid, dann habe ich einfach nicht genug Gehirnschmalz um hier mitreden zu dürfen.

Dieses an den Haaren herbeigezogene "kann, muss aber nicht" ist in meinen Augen kein Weg um auf einen grünen Zweig zu kommen. Wenn ich Standards habe, welche Dinge vorschreiben, wieso kann ich mich nicht danach richten? Ich dachte bisher immer genau das sei der Grund für eben diese.

Zitat Nummer 3 hätte ich gerne mit ein wenig mehr Text gesehen. So aus dem Kontext gerissen ist es selbstverständlich Unfug. Aber ich habe hier einen Link indem Worte welche meinen vom Sinn her ähneln niedergeschrieben sind: http://www.spieleprogrammierung.net/2010…entwickeln.html

Was das letzte Zitat betrifft so wollte ich damit ausdrücken, dass Programme auf anderen Rechnern nicht auf einmal Werte nicht mehr aufnehmen können da ihre Größe schlichtweg nicht mehr ausreicht...es ist ja nicht so, als würde das überall Verwendung finden. Ich beschäftige mich nun eine Weile mit C++ und habe viele Artikel gelesen, einer davon sagte beispielsweise aus das man mittels folgendem Rechnerunabhängige Definitionen schaffen könne:

C-/C++-Quelltext

1
typedef short int16

Selbstverständlich kann auch etwas falsches niedergeschrieben werden, aber naja, das ist dann eben so eine Sache. Sollte das bisher von mir gesammelte Wissen fehlerhaft sein ist eine Begradigung dieser Tatsache natürlich wünschenswert. Ich bin dir deiner Fragen und Antworten übrigens dankbar dot, auch wenn ich nicht so klingen mag, aber immerhin lerne ich etwas :) .

Ach ja, zu meinen Worten "gefürchtete Portabilität": Ich habe genug Threads zum Thema "Mein Programm läuft auf anderen Rechnern nicht" in diversen Foren gelesen. Meine Finger machten sich da einfach selbständig, aber so unrecht kann ich da wohl nicht haben, oder etwa doch?

Mlg
S4My

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

27

10.06.2012, 00:14

Weil selbst wenn ich mal eine endlos loop oder dergleichen habe, wie bspw. einen viel zu großen Wert zuzuweisen, bleibt es im Range von 0 - 255.

Mit anderen Worten: Dir würde der Bug niemals auffallen...

S4My

unregistriert

28

10.06.2012, 00:16

Mit anderen Worten: Dir würde der Bug niemals auffallen...


Was ist mit Logfiles? Ist das nicht genau deren Sinn?

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

29

10.06.2012, 00:17

Was genau hat das jetzt mit Logfiles zu tun?

S4My

unregistriert

30

10.06.2012, 00:19

Die Daten werden in die Datei geschrieben, aus dieser kann man dann die Laufzeitfehler wie diesen Bug auslesen, oder etwa nicht?

Werbeanzeige