Du bist nicht angemeldet.

Werbeanzeige

Beiträge: 1 235

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

11

04.06.2012, 16:24

Hast recht.

Was mir gerade noch einfällt:
Im gcc gibt es eine Compileranweisung "__attribute__((packed))" die den Compiler sagt, er soll alle Werte direkt aneinander speichern, ohne Lücken.
Ohne dieses Attribut, können die Werte zu gunsten den Performance(?) mit Lücken abgespeichert werden.

struct {
char X;
char Y;
}

Diese Struktur wäre dann 8 Byte groß.

S4My

unregistriert

12

04.06.2012, 17:01

4 Milliarden um etwas genauer zu sein.
Auf 64Bit sogar bis zu 18 Trilliaden.

Die Zahlen waren nur aus der Luft gegriffen :D . Mir ging es eigentlich nur um das Thema mit den shorts und den, wie auch im Zitat zu lesenden, Unterschied der int-Variablengröße je nach Rechner.
Aber ich fürchte wir entfernen uns langsam aber sicher zu sehr vom eigentlichen Thema. Da dies ja auch im Prinzip bereits erledigt ist und der Ersteller dieses Threads seine Antwort hat könnte er denke ich als "erledigt" gekennzeichnet werden. Interessieren würde es mich jedoch schon, das Optimieren der Leistung, wieso schreibt nicht einer einen Artikel im Wiki. Da es bei Spielen ja auch sehr um Performance geht würde es sich sicher gut einreihen ^^ .

lg
S4My

S4My

unregistriert

13

09.06.2012, 20:54

Schön, wie ich gerade sehe haben wir also einen eigenen Thread für dieses Thema erhalten. Tja, danke an dot ^^ .

Wenn sich schon so eine Gelegenheit bietet so sollte man sie nicht verstreichen lassen, also dann:

Ich persönlich bin der Meinung, dass es von einem guten Programmierstil zeugt wenn man Variablen passend zum Verwendungszweck benutzt. Sprich, für Werte welche maximal 600 brauchen shorts zu verwenden und nicht die, vom Rechner abhängigen, int Variablen. Es ist meiner Meinung nach auch sinnvoller mittels typedef sich durch short und long exaktere ints zu definieren, bei denen man genau sagen kann ob sie nun 16 oder 32 bit haben werden. Die Regel ist ja schließlich:

32-bit System: int == short
64-bit System: int == long

Was nun die Performance angeht :thinking: , mein Wissen über die internen Abläufe ist dafür einfach noch nicht groß genug, gebe ich leider zu. Aber an dieser Stelle kann man mich kleinen Anfänger gerne eines Besseren belehren.

Mlg und gespannt auf die Antworten
S4My

PS: Ja, es ist mir klar ich schreibe hier nichts neues und es ist bereits vorher zu lesen, jedoch wollte ich einfach mal allgemein eine Frage unabhängig der zuvor abgelaufenen Diskussionen stellen.

Beiträge: 1 235

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

14

09.06.2012, 22:10

Zitat

32-bit System: int == short

Dieser Vergeleich ergibt false, weil:
sizeof(int) == 4
sizeof(short) == 2

Und bei LLP64(Windows) und LP64(Linux)bleibt int auch auf 64Bit Systemen 4 Byte breit.
http://de.wikipedia.org/wiki/64-Bit-Arch…ogrammiermodell

Wobei ich es auch generell für guten Stil halte, an passender Stelle auch (u)int?* einzusetzen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (30.12.2012, 23:22)


FSA

Community-Fossil

  • Private Nachricht senden

15

09.06.2012, 22:20

Ich persönlich verwende immer int, string/char*/[x] float, bool/BOOL. Egal wie groß die Werte sind. Denn die Paar Bytes... Früher hätte man aufpassen müssen. Aber in Zeiten von 24GB Arbeitsspeicher doch nicht mehr. Und auch wegen dem Geschlecht hätte ich entweder int oder bool benutzt. Wobei man dann true als Männlich/Weiblich definieren sollte.
Bei dem Alter hätte ich ganz klar int genommen. Damit Architekt nicht denkt, dass man auch -1 Jahre werden kann, kann man ja ganz einfach sagen:

C-/C++-Quelltext

1
int GetAge()     {return abs(iAge);}

^^

Achja und Deutschland: TOOOOOOOOORRR!!!!!

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

16

09.06.2012, 22:22

Ich persönlich bin der Meinung, dass es von einem guten Programmierstil zeugt wenn man Variablen passend zum Verwendungszweck benutzt. Sprich, für Werte welche maximal 600 brauchen shorts zu verwenden und nicht die, vom Rechner abhängigen, int Variablen.

Aus bereits genannten Gründen ist das imo keine gute Heuristik. Ja, die Datentypen haben potentiell verschiedene Wertebereiche. 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. Abgesehen davon ist der exakte Wertebereich der einzelnen Datentypen von der jeweiligen Plattform und dem jeweiligen Compiler abhängig. Der C++ Standard legt nur gewisse Mindestgrenzen fest. short ist genauso "vom Rechner abhängig" wie int.

Es ist meiner Meinung nach auch sinnvoller mittels typedef sich durch short und long exaktere ints zu definieren, bei denen man genau sagen kann ob sie nun 16 oder 32 bit haben werden. Die Regel ist ja schließlich:

32-bit System: int == short
64-bit System: int == long

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.

Was nun die Performance angeht :thinking: , mein Wissen über die internen Abläufe ist dafür einfach noch nicht groß genug, gebe ich leider zu. Aber an dieser Stelle kann man mich kleinen Anfänger gerne eines Besseren belehren.

Nicht jeder Computer kann an jedes beliebige Byte im Speicher zugreifen. Und auch auf Computern die das können (z.B. ein x86 PC), ist nicht jeder Zugriff an jede Adresse immer gleich schnell.
Wenn du z.B. sowas hast:

C-/C++-Quelltext

1
2
3
4
5
struct Bla
{
  short a;
  int b;
};

Dann wird dein Compiler für x86 zwischen x und y zwei Byte freilassen, damit das Offset von a ein Vielfaches von 4 ist (kannst dich per sizeof(Bla) selbst davon überzeugen). Denn der Zugriff auf a ist für die CPU dann wesentlich effizienter. Durch die Verwendung von short hast du in diesem Beispiel also nichts gewonnen. Du kannst deinem Compiler natürlich sagen, dass er die zwei Elemente direkt aneinander packen soll, dann wird aber der Zugriff auf die Elemente dieses struct potentiell langsamer...

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (09.06.2012, 22:31)


Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 490

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

17

09.06.2012, 22:46

Also gibt es für dich/euch keinerlei Grund short & byte zu verwenden bzw. ihr verwendet _immer_ int, egal worum es geht? ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

18

09.06.2012, 22:50

Also gibt es für dich/euch keinerlei Grund short & byte zu verwenden bzw. ihr verwendet _immer_ int, egal worum es geht? ;)

Natürlich gibt es Gründe short und unsigned char (ich vermute das meinst du mit byte) zu verwenden. Die Tatsache dass es "ausreichend" ist, ist nur imo kein solcher Grund. int ist der Default und alles andere kommt dann zum Einsatz, wenn es explizite Gründe gibt, etwas anderes zu verwenden; beispielsweise eben wenn ich mit irgendwelchen Binärdateien arbeite, wo man dann tatsächlich Datentypen von genau definierter Größe braucht...

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


Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 490

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

19

09.06.2012, 23:02

Also gibt es für dich/euch keinerlei Grund short & byte zu verwenden bzw. ihr verwendet _immer_ int, egal worum es geht? ;)

Natürlich gibt es Gründe short und unsigned char (ich vermute das meinst du mit byte) zu verwenden. Die Tatsache dass es "ausreichend" ist, ist nur imo kein solcher Grund. int ist der Default und alles andere kommt dann zum Einsatz, wenn es explizite Gründe gibt, etwas anderes zu Verwenden; beispielsweise wenn ich mit Binärdateien arbeite, wo man dann tatsächlich Datentypen von genau definierter Größe braucht...

Okay. Aber wenn es um sowas wie Alter, Punkte, Mana -was weiß denn ich- gehen würde, als Attribute einer Klasse, würdest du int verwenden, richtig?
Zusatzfrage: würdest du _nur_ int verwenden oder wenigstens auch, falls es passen würde, ein unsigned davor setzen? Einfach so aus Interesse... ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

20

09.06.2012, 23:03

Ich würde int verwenden, außer ich brauche tatsächlich den anderen Wertebereich oder das spezielle Verhalten eines unsigned int. In den von dir genannten Beispielen würde ich vermutlich für alle drei Dinge int verwenden. Wenn ich ausdrücken wollte, dass z.B. für ein Alter nur ganz bestimmte Werte möglich sind, dann würde ich einen entsprechenden eigenen Typ definieren.

Werbeanzeige