Ermitteln Sie 64 Bits in C mit size_t

8

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.

    
Cyan 08.06.2013, 09:39
quelle

6 Antworten

5
___ qstnhdr ___ Ermitteln Sie 64 Bits in C mit size_t ___ answer16998230 ___

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?

    
___ answer16998346 ___

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)].

    
___ answer16998493 ___

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.

%Vor%

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?

    
___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ tag12364bit ___ Eine 64-Bit-Architektur ist normalerweise ein System, in dem Adressen (Zeiger) 64 Bit breit sind. Manchmal kann es ein System bedeuten, bei dem die "natürliche" Größe für Integer-Berechnungen (die Wortgröße) 64 Bits beträgt. ___ answer16998567 ___

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.

    
___ tag123portability ___ Portabler Code kann in mehreren Umgebungen mit wenig bis keinen Änderungen ausgeführt werden. Tragbare Anwendungen können z.B. ein USB-Laufwerk ohne Änderung der Computerumgebung. ___ qstntxt ___

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.

    
___ answer16998228 ___
  

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.

    
___
Oswald 08.06.2013, 09:53
quelle
8

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?

    
Dietrich Epp 08.06.2013 09:47
quelle
3
  

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.

    
md5 08.06.2013 09:47
quelle
0

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)].

    
Mats Petersson 08.06.2013 10:02
quelle
0

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.

%Vor%

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?

    
Secure 08.06.2013 10:21
quelle
-1

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.

    
Steven Ding 08.06.2013 10:29
quelle

Tags und Links