Warum int statt char in struct tm? (<time.h>)



  • Hallo an alle,

    ich lese gerade mal wieder ein Buch und habe dort die tm Struktur aus <time.h> abgedruckt gesehen:

    struct tm {
        int    tm_sec;
        int    tm_min;
        int    tm_hour;
        int    tm_mday;
        int    tm_mon;
        int    tm_year;
        int    tm_wday;
        int    tm_yday;
        int    tm_isdst;
    }
    

    Und ich frage mich, warum man für z.B. Sekunden, Minuten und Stunden integer-variablen reserviert, wo doch char längst ausreichen würde.
    tm_sec kann ja höchstens den Wert 60 annehmen. Warum also eine Variable benutzen die (auf alten Systemen) mindestens 2 Byte groß ist, wenn auch ein Byte reichen würde?

    Sicherlich ist das jetzt relativ unwesentlich, ob da nun 1 (bzw. heutzutage mindestens 3) Byte verschwendet werden oder nicht, weil wir mittlerweile genügend Speicher zur Verfügung haben. Trotzdem denke ich, dass bei einer Header-Datei wie time.h irgendein Grund dahinterstecken muss, wenn man statt Char- Integer-Werte verwendet und so mehrmals Bytes verschwendet.

    Ich habe auch schon in #c nachgefragt, im Freenode, aber da konnte mir auch niemand eine Antwort geben. Weiß hier jemand darüber bescheid?



  • das einzige, was mir dazu einfällt, ist, dass man vielleicht die ausrichtung der werte innerhalb der struktur damit erreicht. alle beginnen an einer adresse, die durch sizeof(int) (einem typischen ausrichtungswert vieler architekuren) teilbar sind, sofern man die startadresse einer solchen struct ebenso auf eine solche adresse ausrichtet.



  • atzeegge schrieb:

    Ich habe auch schon in #c nachgefragt, im Freenode, aber da konnte mir auch niemand eine Antwort geben. Weiß hier jemand darüber bescheid?

    weil man damit nicht immer performant ist. Im "ARM System Developer's Guide" Buch gibt es z.B. eine schöne Erklärung dazu. Es gibt Systeme, die nur über 32-Bit Register verfügen (z.b. ARM) und wenn du nur einzelene chars in die Register holen willst, dann muss die CPU unnötig casten, damit nur 8 bits ins Register kommen bzw. nur 8 Bits vom Regster "in die Variable" kommen. Wenn man in einem struct dann nur ints hat, dann ist einfacher sich im Speicher zu bewegen (weil es keine Paddings bytes mehr gibt, vgl. besserwissers Antwort).

    Im oben genannten Buch steht sogar, dass man immer int nehmen sollte, auch wenn man mit int8 und/oder int16 besser bedient wäre. Leider habe ich das Buch nicht dabei und kann es nicht genau zittieren (und es ist schon ein bisschen her, als ich es gelesen habe), kann also nicht 100% so wiedergeben wie es im Buch steht.

    edit: ach wie geil, das buch kann man online bei google books lesen: sehr empfehlenswert: Chapter 5: Efficient C Programming

    edit 2: 😞 schade, es handelt sich nur um ein Preview und genau genau "das beste" ist nicht vorhanden, schade.



  • Ok, vielen Dank für die Antworten - jetzt muss ich mir nicht weiter den Kopf darüber zerbrechen 😉


Anmelden zum Antworten