Ist sizeof(size_t)==8
das Äquivalent zu sagen, dass die Plattform 64-Bit ist?
Umgekehrt ist sizeof(size_t)==4
das Äquivalent zu sagen, dass die Plattform 32-Bit ist?
Wichtiger noch: Ist dieser Test sicher und zuverlässig , unter Berücksichtigung der Portabilität von Betriebssystemen und Compilern? Gibt es einige seltsame Fälle, einschließlich möglicher Situationen, in denen size_t
möglicherweise fehlt?
Ich bin ein bisschen besorgt, dass size_t
möglicherweise nur für C99-Umgebungen garantiert ist.
Praktisch, ja, das ist sicher und zuverlässig. Plattformen, auf die Sie wahrscheinlich in der Zukunft zielen oder die Sie jemals zielen, sind alle byteadressierbar, wobei 8-Bit-Bytes und size_t
der Maschinenwortlänge entsprechen. Die meisten Plattformen stellen sicher, dass dies auf unbestimmte Zeit so bleibt (POSIX garantiert dies zum Beispiel).
Theoretisch gesehen, nein, das ist nicht sicher und zuverlässig. Obskure Systeme wie Cray-1, PDP-10 und verschiedene DSP-Systeme werden Sie stolpern. Denken Sie jedoch darüber nach: Wie groß ist die Wahrscheinlichkeit, dass Sie jemals Software für eine Cray-1 entwickeln würden, die veraltet war, bevor der Junior-Ingenieur, der neben Ihnen saß, geboren wurde?
Die eigentliche Frage ist: Was werden Sie tun, wenn weder sizeof(void*)
noch sizeof
wahr sind? Sie können auch überprüfen, dass char
- das vermeidet Verwirrung, wenn die Plattform etwas anderes als "commmon, moderne Hardware", z. Cray-1, PDP-10, woanders erwähnt.
Irgendwann werde ich voraussagen, dass 128-Bit-Maschinen existieren werden, aber ich denke auch, dass dies weit in der Zukunft liegt, da wir derzeit nur 75% der verfügbaren Bits in 64-Bit verwenden können Maschinen für Speicheradressen (size_t bezieht sich auf Speicheradressierung). Beachten Sie, dass die oberen 16 Bits 65535 Mal mehr Speicher als das aktuelle Limit zur Verfügung stellen. Es ist also noch ein weiter Weg, bis wir nicht mehr genügend Speicherplatz haben. [Vergessen Sie nicht die aktuellen Kosten für den Aufbau einer Maschine mit 256 TB Speicher, was die aktuelle Grenze ist - die meisten Systeme kommen dem DISKSPACE nicht einmal nahe, egal RAM (grobe Berechnung in meinem Kopf, aber 42 Bits sind 4 TB, also 48 Bit sollten 32 mal mehr sein, denke ich)].
CHAR_BIT
wurde bereits erwähnt, und es gibt den theoretischen Fall, dass ein zusätzliches Padding innerhalb von %code% nicht für den Wert verwendet wird. Sie können jedoch die genaue Anzahl relevanter Wert-Bits für einen unsigned Integer-Typ zur Laufzeit sicher und portabel berechnen.
Wenn Sie diese Informationen zum Zeitpunkt der Kompilierung benötigen, ist es möglicherweise eine gute Idee, einen %code% auf den plattformspezifischen Wert zu setzen und in Ihren Unit-Tests zu verifizieren, dass sie die tatsächliche num_of_bits erfüllt. Sie haben Komponententests, richtig?
Um den Zeiger zu überprüfen, ist dies wahr, aber nicht in der Laufzeit! Sagen Sie, wenn Sie den Quellcode verteilen, funktioniert es. Wenn Sie jedoch die Binärdatei verteilen, ist sie nicht zuverlässig. Der Wert wird während der Kompilierzeit ermittelt.
Ist %code% das Äquivalent zu sagen, dass die Plattform 64-Bit ist? Umgekehrt ist %code% das Äquivalent zu sagen, dass die Plattform 32-Bit ist?
Wichtiger noch: Ist dieser Test sicher und zuverlässig , unter Berücksichtigung der Portabilität von Betriebssystemen und Compilern? Gibt es einige seltsame Fälle, einschließlich möglicher Situationen, in denen %code% möglicherweise fehlt?
Ich bin ein bisschen besorgt, dass %code% möglicherweise nur für C99-Umgebungen garantiert ist.
Noch wichtiger: Ist dieser Test unter allen Umständen sicher und zuverlässig, wenn man die Übertragbarkeit von Betriebssystemen und Compilern berücksichtigt?
Es gibt keinen "portablen Weg", um dies zu tun, weil der C-Standard die Umgebung %code% so groß definiert, wie er will (solange sie größer ist als %code% ). Aber der C-Standard definiert nicht, was "32-Bit" - und "64-Bit" -Plattformen sind.
Bei gemeinsamen Speichermodellen beträgt %code% jedoch 32 Bit auf 32-Bit-Plattformen und 64 Bit auf 64-Bit-Plattformen.
Ich bin ein bisschen besorgt, dass %code% möglicherweise nur für C99-Umgebungen garantiert ist.
%code% ist auch in C89. Solange Ihre Umgebung Standard ist, sollte daher %code% definiert werden.
Praktisch, ja, das ist sicher und zuverlässig. Plattformen, auf die Sie wahrscheinlich in der Zukunft zielen oder die Sie jemals zielen, sind alle byteadressierbar, wobei 8-Bit-Bytes und size_t
der Maschinenwortlänge entsprechen. Die meisten Plattformen stellen sicher, dass dies auf unbestimmte Zeit so bleibt (POSIX garantiert dies zum Beispiel).
Theoretisch gesehen, nein, das ist nicht sicher und zuverlässig. Obskure Systeme wie Cray-1, PDP-10 und verschiedene DSP-Systeme werden Sie stolpern. Denken Sie jedoch darüber nach: Wie groß ist die Wahrscheinlichkeit, dass Sie jemals Software für eine Cray-1 entwickeln würden, die veraltet war, bevor der Junior-Ingenieur, der neben Ihnen saß, geboren wurde?
Noch wichtiger: Ist dieser Test unter allen Umständen sicher und zuverlässig, wenn man die Übertragbarkeit von Betriebssystemen und Compilern berücksichtigt?
Es gibt keinen "portablen Weg", um dies zu tun, weil der C-Standard die Umgebung SIZE_MAX
so groß definiert, wie er will (solange sie größer ist als 65535
). Aber der C-Standard definiert nicht, was "32-Bit" - und "64-Bit" -Plattformen sind.
Bei gemeinsamen Speichermodellen beträgt size_t
jedoch 32 Bit auf 32-Bit-Plattformen und 64 Bit auf 64-Bit-Plattformen.
Ich bin ein bisschen besorgt, dass
size_t
möglicherweise nur für C99-Umgebungen garantiert ist.
size_t
ist auch in C89. Solange Ihre Umgebung Standard ist, sollte daher size_t
definiert werden.
Die eigentliche Frage ist: Was werden Sie tun, wenn weder sizeof(size_t) == 8
noch sizeof(size_t) == 4
wahr sind? Sie können auch überprüfen, dass CHAR_BIT == 8
- das vermeidet Verwirrung, wenn die Plattform etwas anderes als "commmon, moderne Hardware", z. Cray-1, PDP-10, woanders erwähnt.
Irgendwann werde ich voraussagen, dass 128-Bit-Maschinen existieren werden, aber ich denke auch, dass dies weit in der Zukunft liegt, da wir derzeit nur 75% der verfügbaren Bits in 64-Bit verwenden können Maschinen für Speicheradressen (size_t bezieht sich auf Speicheradressierung). Beachten Sie, dass die oberen 16 Bits 65535 Mal mehr Speicher als das aktuelle Limit zur Verfügung stellen. Es ist also noch ein weiter Weg, bis wir nicht mehr genügend Speicherplatz haben. [Vergessen Sie nicht die aktuellen Kosten für den Aufbau einer Maschine mit 256 TB Speicher, was die aktuelle Grenze ist - die meisten Systeme kommen dem DISKSPACE nicht einmal nahe, egal RAM (grobe Berechnung in meinem Kopf, aber 42 Bits sind 4 TB, also 48 Bit sollten 32 mal mehr sein, denke ich)].
CHAR_BIT
wurde bereits erwähnt, und es gibt den theoretischen Fall, dass ein zusätzliches Padding innerhalb von size_t
nicht für den Wert verwendet wird. Sie können jedoch die genaue Anzahl relevanter Wert-Bits für einen unsigned Integer-Typ zur Laufzeit sicher und portabel berechnen.
Wenn Sie diese Informationen zum Zeitpunkt der Kompilierung benötigen, ist es möglicherweise eine gute Idee, einen #define SIZEOF_BITS 32
auf den plattformspezifischen Wert zu setzen und in Ihren Unit-Tests zu verifizieren, dass sie die tatsächliche num_of_bits erfüllt. Sie haben Komponententests, richtig?
Um den Zeiger zu überprüfen, ist dies wahr, aber nicht in der Laufzeit! Sagen Sie, wenn Sie den Quellcode verteilen, funktioniert es. Wenn Sie jedoch die Binärdatei verteilen, ist sie nicht zuverlässig. Der Wert wird während der Kompilierzeit ermittelt.
Tags und Links c 64bit portability