Wann std::size_t und wann int?



  • size_t_t schrieb:

    Wann sollte ich den einen Typ gegenüber dem anderen bevorzugen?

    Wenn der eine und nicht der andere Typ zurückgegeben wird

    Welche Vorteile bietet mit std::size_t?

    Mit oder ohne? 😕



  • ...



  • size_t benutzt man, überraschenderweise, wenn man mit Größen (wie viele Elemente? wie viele Byte?) arbeitet.



  • "size_t" ist i.a. unter 32 Bit Speichermodell 32 Bit unsigned und unter 64 Bit Speichermodell 64 Bit unsigned

    "ptrdiff_t" ist i.a. unter 32 Bit Speichermodell 32 Bit signed und unter 64 Bit Speichermodell 64 Bit signed

    "unsigned int" ist i.a. unter 32 Bit Speichermodell 32 Bit unsigned und unter 64 Bit Speichermodell 32 Bit unsigned

    "int" ist i.a. unter 32 Bit Speichermodell 32 Bit signed und unter 64 Bit Speichermodell 32 Bit signed

    z.B. Array Index

    int myArray [myArraySize];
    size_t myIndex = ...;
    int i = myArray [myIndex];
    

    wenn der Arrayindex nicht als size_t, sondern als unsigned int deklariert wäre, gibt es unter 64 Bit Speichermodell Probleme

    ähnlich:

    char * p1 = ...;
    char * p2 = ...;
    ptrdiff_t myOffset = p1 - p2;
    

    wenn myOffset nicht als ptrdiff_t, sondern als int deklariert wäre, gibt es unter 64 Bit Speichermodell Probleme



  • cooky451 schrieb:

    size_t benutzt man, überraschenderweise, wenn man mit Größen (wie viele Elemente? wie viele Byte?) arbeitet.

    Wenn man mit Grössen von Dingen arbeitet die in den Speicher passen/im Speicher liegen.
    Wenn man z.B. mit File-Grössen arbeitet sollte man dafür nicht unbedingt size_t verwenden.

    Und wenn man's ganz genau nimmt, dann sollte man auch Bits von beliebig grossen Datenstücken nicht mit size_t zählen, auch wenn diese immer im Speicher liegen. Weil's halt typischerweise 8x mehr Bits gibt als Bytes.



  • Das mit den Bits ist so eine Sache, auf 64 bit Systemen sieht's da schlecht aus. Aber wenn wir mal ehrlich sind, wer muss schon mehr als 2^64 von irgendwas zählen? 🤡



  • Wann nehmt ihr eigentlich unsigned int?

    <💡>



  • cooky451 schrieb:

    Das mit den Bits ist so eine Sache, auf 64 bit Systemen sieht's da schlecht aus. Aber wenn wir mal ehrlich sind, wer muss schon mehr als 2^64 von irgendwas zählen? 🤡

    "And the Lord could not count grains of sand with a 32-bit word." julia ecklar - the eternal flame



  • glühbirne schrieb:

    Wann nehmt ihr eigentlich unsigned int?

    <💡>

    So ziemlich immer, wenn ich keine Lust habe, <cstddef> zu includen und ueberall std:: zu schreiben.



  • glühbirne schrieb:

    Wann nehmt ihr eigentlich unsigned int?

    Wann immer eben ein unsigned int benötigt wird. Beispielsweise bei irgendwelchen Bitmasken, da z.B. ein Rechtsshift auf signed int undefiniert ist...



  • cooky451 schrieb:

    Das mit den Bits ist so eine Sache, auf 64 bit Systemen sieht's da schlecht aus. Aber wenn wir mal ehrlich sind, wer muss schon mehr als 2^64 von irgendwas zählen? 🤡

    Graf Zahl?



  • dot schrieb:

    da z.B. ein Rechtsshift auf signed int undefiniert ist...

    gibt es eigentlich wie in Java so einen vorzeichenlosen shift? (java: >>>)



  • Skym0sh0 schrieb:

    dot schrieb:

    da z.B. ein Rechtsshift auf signed int undefiniert ist...

    gibt es eigentlich wie in Java so einen vorzeichenlosen shift? (java: >>>)

    Ähm, was glaubst du ist ein unsigned int!?



  • dot schrieb:

    da z.B. ein Rechtsshift auf signed int undefiniert ist...

    Ich hätte jetzt gemeint implementation-defined.



  • hustbaer schrieb:

    dot schrieb:

    da z.B. ein Rechtsshift auf signed int undefiniert ist...

    Ich hätte jetzt gemeint implementation-defined.

    Stimmt, sry, natürlich implementation-defined, aka nicht portabel und darum gings mir... 😉


Anmelden zum Antworten