size_t oder int?
-
Hallo,
ich sehe immer wieder unterschiedliche verwendung von schleifendurchläufen....einmal mit size_t variablen und einmal mit int.
Ich weiß dass size_t ein typedef unsigned int ist.
Sollte man jetzt eher size_t verwenden oder ist es wurscht? Was bringt mit ein size_t ?
-
Soweit ich weiß - gut möglich, dass ich falsch liege - verwendet man size_t für, wie der Name schon sagt, "Größen", z.B. wenn man mit sizeof() den Speicherbedarf eines Typs erhalten möchte.
-
Verwende, wenn du C++ programmierst, immer size_t anstelle von unsigned -
da machste nie was falsch.
-
solange man auf einem system und bei einem compiler bleibt, wird man in keine probleme rennen, wenn man unsigned verwendet. aber auf anderen systemen könnte es zu problemen kommen, wenn man "hard kodierte" typen verwendet. stell dir z.b. vor du entwickelst auf einem system, dass unsigned als 32 bit typ definiert. dann klappt alles super. jetzt soll das ganze aber auf einem system gebaut werden, auf dem unsigned nur 16 bit hat und size_t beispielsweise als 32 bit long definiert ist. hättest du size_t verwendet, ginge alles gut. hast du unsigned verwendet, könnte ziemlicher blödsinn rauskommen.
-
mal ne erweiterte frage die mir gerade in den sinn kommt....
macht ihr das so dass ihr wirklich uint verwendet statt int in for-schleifen?
Ich mein wenn man den wertebereich eines halben ints sowieso nicht sprengt könnte es doch wurscht sein - aber gehört es zum guten programmierstil?
-
Nimm den Datentyp, der gerade am besten passt.
Du kannst auch short nehmen, wenn Du weißt, dass Dir das vom Zahlenbereich reicht und die Variable als short gerade am besten passt.
-
gast_xy schrieb:
mal ne erweiterte frage die mir gerade in den sinn kommt....
macht ihr das so dass ihr wirklich uint verwendet statt int in for-schleifen?Ich persönlich verwende als Typ für Laufvariable eigentlich immer den zur Abbruchbedingung passenden Typen.
Wenn ich also etwas 10 mal machen will, schreibe ich:for (int i = 0; i != 10; ++i) {...}
10 hat den Typ int, also verwende ich für i auch int.
Will ich hingegen solange etwas tun, bis die Größe eines STL-Containers erreicht wurde, schreibe ich:
for (ContainerType::size_type i = ...; i != container.size(); ++i) {...}
container.size() ist vom Typ ContainerType::size_type, also verwendet i diesen Typ.
Wenn der Typ nicht durch einen bestimmten Ausdruck vorgegeben ist, nehme ich eigentlich immer int. unsigned-Typen nur dann, wenn ich irgenwie wild rumshiften und bit-twiddeln muss.
-
danke - ich will wirklich nicht rumalbern....aber wäre es nicht korrekter in for-schleifen die z.B nur bis 10 gehen dann nur einen short zu nehmen? Müsste das von der Laufzeit nicht schneller gehen - schließlich muss er weniger speicher alloziieren -AUCH wenn es natürlich wahrscheinlich nur um 10^-9 sekunden schneller ist oder so ....aber hab ich unrecht?
Danke
-
Speicher und Rechenbedarf richtet sich doch vorallem nach den verwandten Algorithmen.
Genau genommen könntest du auch ein char nehmen, wenn du sparen wolltest.Aber im Endeffekt dürfte sich dies nix tun.
-
HumeSikkins schrieb:
...unsigned-Typen nur dann, wenn ich irgenwie wild rumshiften und bit-twiddeln muss.
das machen viele, aber warum eigentlich? der einzige unterschied sind wohl nur die 'right shifts', die eventuell einsen nachrücken lassen.
aber sonst ist es doch für bitfummeleien egal, ob man 'signed' oder 'unsigned' nimmt.
-
Bei Schleifen, vorallem bei Schleifen, die schnell durchlaufen werden, nehme ich immer int!
Ich denke doch, dass ein 32-Bit Rechner schneller auf 4 Bytes zugreifen kann als auf 2 Bytes!
Und wenn man jetzt so ne Konstruktion hat:for( i=0; i<10000 ; ++i ) if( i == 9000 ) break;
(Ich weiß, sinnlos)
... ist es vielleicht besser ein int zu nehmen statt ein short, oder?
Wär nur so ne "Performance-Frage"!Zum Thema:
Ich würde size_t verwenden!
Ist doch nicht so viel Arbeit mehr, die drei Zeichen mehr zu schreiben!Gruß
tHOMY
-
die zeit, die man verschwendet, um sich über den sinn und unsinn des typs einer zählervariable einer schleife gedanken zu machen, dürfte die aufsummierte zeitersparnis durch performancegewinn aller programminstallationen während des gesamten lebenszyklusses der software bei weitem übersteigen
wenn der vergleich einen speziellen typ fordert, dann nimmt man den typen, ansonsten int. fertig, nie wieder drüber nachdenken
-
Undertaker schrieb:
das machen viele, aber warum eigentlich? der einzige unterschied sind wohl nur die 'right shifts', die eventuell einsen nachrücken lassen.
Links zu shiften ist genauso problematisch, weil du das Vorzeichenbit u.U. nicht los wirst.
Undertaker schrieb:
aber sonst ist es doch für bitfummeleien egal, ob man 'signed' oder 'unsigned' nimmt.
Sofern man Verknüpfungsoperatoren nimmt (AND, OR, XOR), ist dies ziemlich egal. Bei Shifts sieht das anders aus. IdR möchte man bei Verwendung der Shift Operatoren logisch schieben, das garantiert der Standard aber nur für vorzeichenlose Typen. Vorzeichenbehaftete Typen reagieren 'implementationsspezifisch', können also sowohl logische als auch arithmetische Ergebnisse liefern. Deshalb sollte man grundsätzlich nur vorzeichenlose Typen verwenden, da das Ergebnis bestimmt ist und arithmetische Ergebnisse nicht notwendig sind.