Einsatz von short
-
Hallo zusammen,
Ich hab mich schon häufig gefragt, wieso der Datentyp
short int
so selten verwendet wird. Die meisten denken sich wohl, es spiele kaum eine Rolle, ob man jetzt stattdessenint
nimmt, weil das auch kaum Speicher beansprucht.Selber verwende ich jedoch short-Variablen relativ häufig, vor allem wenn ich z.B. nur 7 Zustände haben kann, dann finde ich schon der Wertebereich des Short-Integers (65k) zu viel, aber dann 4 Milliarden... (Klar könnte ich char nehmen, aber das finde ich irgendwie unpassend, man muss es auch immer explizit konvertieren, wenn man es nicht als Zeichen darstellen will).
Was ich auch schon gehört habe, wäre, dass
int
der ideale Typ wäre, weil er mit 4 Bytes meistens gerade an die Grösse der Prozessorregister angepasst ist. Heisst das,short
ist diesbezüglich langsamer? Können nicht zweishort
-Werte in einem Register gespeichert werden, und dann sieht es bezüglich Performance sogar besser aus?
-
Nexus schrieb:
Ich hab mich schon häufig gefragt, wieso der Datentyp
short int
so selten verwendet wird.Weil man sich eigtl nicht nach oben (bzw unten) beschränken will... Ich selbst würd es auch nur für IDs oder so verwenden - allerdings muss man es dann halt überall ändern, so bald man mehr als 64k Benutzer oder was auch immer hat... Bei 4Milliarden sollte das nicht so schnell passieren ^^
Nexus schrieb:
Die meisten denken sich wohl, es spiele kaum eine Rolle, ob man jetzt stattdessen
int
nimmt, weil das auch kaum Speicher beansprucht.Und der Speicher vom OS eh meist in 4B-Stückchen aufgeteilt wird - also nützt es wahrscheinlich nicht mal was, short zu nehmen - ich mach es dennoch, wenn ich sicher sein kann, dass keinerlei einschränkungen dadurch entstehen.
Sprich: In der Praxis kann es durchaus vorkommen, dass ein short genau so viel Speicher beansprucht, wie ein int - will jetzt nichts falsches behaupten, aber würde mal behaupten, dass das nur in (großen) Arrays (oder in Dateien bzw. Datenbanken) bemerkbar wird...Nexus schrieb:
wenn ich z.B. nur 7 Zustände haben kann, dann finde ich schon der Wertebereich des Short-Integers (65k) zu viel, aber dann 4 Milliarden... (Klar könnte ich char nehmen, aber das finde ich irgendwie unpassend, man muss es auch immer explizit konvertieren, wenn man es nicht als Zeichen darstellen will).
Und warum nutzt du
enum
nicht? Ist ja gerade für so was gedacht... Wenn du >> unbedingt brauchst, dann verpackst du das halt noch in ne kleine Klasse und kannst dann so gar völlig frei entscheiden, wann was ausgegeben werden soll...Nexus schrieb:
Was ich auch schon gehört habe, wäre, dass
int
der ideale Typ wäre, weil er mit 4 Bytes meistens gerade an die Grösse der Prozessorregister angepasst ist.Bei 32bit Prozessoren stimmt das ^^
Nexus schrieb:
Heisst das,
short
ist diesbezüglich langsamer?Nein, das kann ich mir nicht vorstellen - aber wahrscheinlich auch nicht gerade sehr viel schneller...
Nexus schrieb:
Können nicht zwei
short
-Werte in einem Register gespeichert werden, und dann sieht es bezüglich Performance sogar besser aus?Wie stellst du dir das vor?
Ein Prozessor hat eine bestimmte Anzahl an Registern - aber nicht, um darin Werte dauerhaft zu speichern - dafür ist derStack
da.
Die Register braucht er nur zum Rechnen an sich (+, -, *, /) - und da ist es nun mal so gelöst, dass in jedem Register max. (werden ja nicht immer alle gebraucht)ein
Wert ist..bb
-
Danke für deine ausführliche Antwort.
unskilled schrieb:
Nexus schrieb:
Ich hab mich schon häufig gefragt, wieso der Datentyp
short int
so selten verwendet wird.Weil man sich eigtl nicht nach oben (bzw unten) beschränken will... Ich selbst würd es auch nur für IDs oder so verwenden - allerdings muss man es dann halt überall ändern, so bald man mehr als 64k Benutzer oder was auch immer hat... Bei 4Milliarden sollte das nicht so schnell passieren ^^
Ich nehm es ja auch nur, wenn ich mir sicher bin, dass kein Overflow entsteht.
unskilled schrieb:
Nexus schrieb:
wenn ich z.B. nur 7 Zustände haben kann, dann finde ich schon der Wertebereich des Short-Integers (65k) zu viel, aber dann 4 Milliarden... (Klar könnte ich char nehmen, aber das finde ich irgendwie unpassend, man muss es auch immer explizit konvertieren, wenn man es nicht als Zeichen darstellen will).
Und warum nutzt du
enum
nicht? Ist ja gerade für so was gedacht... Wenn du >> unbedingt brauchst, dann verpackst du das halt noch in ne kleine Klasse und kannst dann so gar völlig frei entscheiden, wann was ausgegeben werden soll...Okay, für das wäre es vielleicht gut,
enum
zu benutzen, weil nur die Zustände zugeordnet werden können. Aber das wären dann wieder 4 Byte :punskilled schrieb:
Nexus schrieb:
Können nicht zwei
short
-Werte in einem Register gespeichert werden, und dann sieht es bezüglich Performance sogar besser aus?Wie stellst du dir das vor?
Ein Prozessor hat eine bestimmte Anzahl an Registern - aber nicht, um darin Werte dauerhaft zu speichern - dafür ist derStack
da.
Die Register braucht er nur zum Rechnen an sich (+, -, *, /) - und da ist es nun mal so gelöst, dass in jedem Register max. (werden ja nicht immer alle gebraucht)ein
Wert ist..Ich dachte, dann könnten gleichzeitig zwei Variablen temporär gespeichert werden, was die Rechenoperation schneller machen könnte. Da hab ich mich wohl geirrt...
Neben den IDs, die man durch
enums
ersetzen könnte, benutz ich eben short auch, wenn man z.B. die Frames eines Objektes zählt (Spieleprogrammierung) und wenn ein Objekt z.B. bereits 300 Frames existiert, wird es zerstört... Da finde ichint
eigentlich unnötig.Also zusammenfassend hat es rein gar keinen Vorteil,
short
anstelle vonint
zu benutzen (von gigantischen Arrays mal abgesehen)? Performance kann man dadurch auch keine herausholen?
-
Also zusammenfassend hat es rein gar keinen Vorteil, short anstelle von int zu benutzen (von gigantischen Arrays mal abgesehen)? Performance kann man dadurch auch keine herausholen?
Das wollte ich damit nicht sagen - weil ich es einfach nicht genau weiß...
Ich wollte nur sagen, dass man (vor allem heutzutage) ja nicht mehr auf jedes Byte gucken muss - auch, wenn jetzt die ganzen Performance-Typen wieder aufschreien werden - wenn ich zwischen sehr gut wartbarem Code und weniger gut lesbarem entscheiden müsste und der gute 1 KB Speicher mehr beanspruchen würde, würde ich ihn noch immer nehmen... Nat. hat das irgendwo ne Grenze und zur Not definiert man die Funktion halt als template - kannste ja auch ma selbst ausprobieren?!#include <ctime> template <typename T, size_t length> clock_t foo (void) { clock_t ticker = clock (); T *arr = new T [length]; T *arr_end = arr + length; T *copy (arr); for (arr = copy; arr != arr_end; ++arr) { *arr = 4; } for (arr = copy; arr != arr_end; ++arr) { *arr *= *arr; } for (arr = copy; arr != arr_end; ++arr) { *arr -= *arr; } delete []copy; return clock () - ticker; } int main () { const clock_t a (foo <int, 1>); const clock_t b (foo <int, 10>); const clock_t c (foo <int, 100>); const clock_t d (foo <int, 255>); const clock_t e (foo <int, 1000>); const clock_t A (foo <short, 1>); const clock_t B (foo <short, 10>); const clock_t C (foo <short, 100>); const clock_t D (foo <short, 255>); const clock_t E (foo <short, 1000>); }
könnte mir aber vorstellen, dass es bei keinem einen messbaren Wert gibt, also einfach noch paar schleifen drum rum machen oder so ^^
kannst ja ma sagen, was rauskam (Releasemodus) - ich kann gerad nich selbst testen ^^
bb
edit: sry, hatte bei den schleifen was vergessen ^^
-
Ihr n00bs,
sowohl int als auch short sind durch zwei Teilbar auf euren x86 CPUs, also gibts mit der Berechnung der Adresse sowieso keine größeren Probleme.
Dazu kommt, dass die x86 Architektur abwärtskompatibel ist und bei 16Bit und 32Bit kein Unterschied festzustellen ist (ich möchte jetzt an dieser Stelle nicht so weit gehen und behaupten es gäbe gar keinen).Der short int wird aus genannten Gründen kaum verwendet. Entweder man will einfach eine Zahl speichern dann nimmt man int. Und sobald man sich um die Größe sorgt will man eh int_16, int_32, etc. verwenden (diese gibt es nicht offiziell, das wird für gewöhnlich durch typedefs realisiert, wenn du mit configure arbeitest bekommst du die in einer config.h serviert).
Also kurz: wenn die Größe relevant ist, dann sind die eingebauten Typen uninterressant da du dich nicht auf deren Größe verlassen kannst. Wenn sie keine Rolle spielt willst du normal eh einen int.Deshalb hat short int keine Relevanz, du wirst ihn normal nur durch ein wchar_t, int_16 etc. indirekt nutzen (wobei wchar_t kein typedef auf short int sein muss, aber bei manchen ist das der Fall).
-
OMFG Du N00b schrieb:
Ihr n00bs
Du Noob
OMFG Du N00b schrieb:
sowohl int als auch short sind durch zwei Teilbar auf euren x86 CPUs
Ach wirklich? Ich würde mal behaupten wollen, dass sowohl short als auch int durch zwei teilbar sind. (aber gut - dann könntest du nat. leider nicht ins spiel bringen, dass du wahrscheinlich keine x86 CPU hast). Wenn du Shift benutzen willst, dann solltest du dir auch im klaren sein, wann es angebracht ist und wann es falsch ist...
OMFG Du N00b schrieb:
also gibts mit der Berechnung der Adresse sowieso keine größeren Probleme.
Wer hat behauptet, dass es das gibt? Oo
OMFG Du N00b schrieb:
Dazu kommt, dass die x86 Architektur abwärtskompatibel ist
Das weiß hier glaube ich jeder
OMFG Du N00b schrieb:
und bei 16Bit und 32Bit kein Unterschied festzustellen ist (ich möchte jetzt an dieser Stelle nicht so weit gehen und behaupten es gäbe gar keinen).
Und genau darum ging es doch gerad...
OMFG Du N00b schrieb:
Der short int wird aus genannten Gründen kaum verwendet.
[und dann wiederholst du noch mal alles oder bringt irgendwelche Dinge an, die mit dem Thema maximal irgendwie in Verbindung stehen - aber keine, die hier von Bedeutung wären]Also denn.. gj Noob...
-
Nexus schrieb:
Was ich auch schon gehört habe, wäre, dass
int
der ideale Typ wäre, weil er mit 4 Bytes meistens gerade an die Grösse der Prozessorregister angepasst ist. Heisst das,short
ist diesbezüglich langsamer? Können nicht zweishort
-Werte in einem Register gespeichert werden, und dann sieht es bezüglich Performance sogar besser aus?int
war in der regel der für die plattform am besten passende typ, bezogen auf registergröße und damit rechengeschwindigkeit. ich schreibe "war", weil bei compilern für die 64-bit-generation der x86-cpus mit dieser tradition gebrochen wurde (int ist dort weiterhin 32 bits breit), wohl aus rücksicht auf minder gut geschriebene software, die sich sonst nicht einfach neu kompilieren ließe.auf 386+ mit 16-bit registern zu rechnen ist schlichtweg langsamer als mit 32-bit registern. wobei ich mich auf vielerorts geschriebenes verlasse, ausprobiert habe ich es nie.
-
@erklärbär der int kann auf 64bit systemen 32bit betragen. er muss es nicht. beispiele für beide methoden sind: msvc mit 32bit int auf 64bit systemen (danke an hustbaer) und der gcc mit 64bit int auf 64bit systemen.
ansonsten: ich nutze short auch eher selten, da sie dank alignment meistens genau soviel speicher brauchen wie ints.
-
ghorst schrieb:
@erklärbär der int kann auf 64bit systemen 32bit betragen. er muss es nicht.
Das ist definitiv falsch! Es hängt vom OS ab, bei JEDEM UNIX muß ein int 32Bit groß sein im 64Bit Modus, und das ist vollkommen unabhängig vom Compiler, weil das so in der Single UNIX Spec definiert ist.
-
Also zusammengefasst gibt es eigentlich keinen Grund,
short
zu verwenden? Besteht nicht die Möglichkeit, dass dadurch schnellerer Code entsteht? Oder muss man sogar Angst haben, dass der Code langsamer wird?
-
@nexus im normalfall: weder noch. der code sollte genauso schnell sein, da shorts mit alignment genauso schnell zugreifbar sind wie ints.
-
Aber durch dieses Alignment werden
short
-Variablen wieints
behandelt (Performance und Speicherverbrauch)? Also gibt es doch keinen Grund, sie zu verwenden?
-
Das sind Mikrooptimierungen von denen man die Finger lassen sollte, außer sie sind absolut notwendig. Wenn shorts für Modellierung ausreichend sind, sollte man sie verwenden. Ob shorts nun schneller oder langsamer als ints sind, hängt von der verwendeten Hardwareplattform ab, und ist keine Eigenschaft des Datentyps selbst.
-
Naja, aber wenn man in den meisten Fällen durch
short
nichts gewinnt, aber sich im Wertebereich einschränken muss, ist die Thematik doch schon eine Überlegung wert...
-
Also um es kurz zu machen. Ich selber brauche äusserst selten den Typ short.
Mir fallen spontan nur zwei Bereiche ein, wo ich shorts einsetze:
- Ich habe bestimmte Vorgaben irgendwoher, zum Beispiel von einer Datenstruktur.
- Ich möchte sicherstellen, dass ein gewisser Datenbereich eingehalten wird in meiner Bibliothek oder meinem Programm. Das kann viele Gründe haben, vielleicht will man einfach eine maximale Grenze setzen, weil es auch kritisch werden könnte, wenn die Zahl höher ginge. Dank dem short muss ich dann keine Bereichsprüfung machen, sondern kann mich auf dessen Grenze verlassen, bzw. darauf, dass der User die Warnungen einhält. Allerdings nicht unbedingt zu empfehlen, da es glaube ich nirgends heisst, dass ein short nicht auch grösser als 2 Bytes sein kann. Beim Standard gibt es da glaub ich nur eine Mindestgrösse-Vorgabe
Grüssli
-
Okay, allen vielen Dank für die Antworten!
Dann werde ich in Zukunft den Datentypshort
mit Bedacht einsetzen...