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