Frage

Wie der Titel sagt, ist es eine elegante und sichere Weg, um festzustellen, ob Architektur (32bit oder 64bit).Von eleganten, können Sie denken, eine präzise, korrekte, kurze, saubere und intelligente Art und Weise.Durch die sichere, denken sicher in der Bezeichnung von standard C89/C99-und Betriebssystem-Unabhängigkeit.

War es hilfreich?

Lösung

Die Größe der Zeiger ist nicht wirklich eine gute Sache, um zu testen - es gibt nicht viel in standard-C, die Sie tun können, mit dem Ergebnis, dass der test trotzdem.

Mein Vorschlag ist, prüfen Sie ((size_t)-1), die größte Größe des Objekts, die C versteht:

    if ((size_t)-1 > 0xffffffffUL)
    {
            printf("> 32 bits\n");
    }
    else
    {
            printf("<= 32 bits\n");
    }

Wenn es ist größer als 0xffffffffUL dann können Sie im Prinzip Objekte, die größer als 2**32 - 1 bytes, die scheint wie ein aussagekräftiger test, als ein nebulöser "32 bits versus 64 bits".

(Für Beispiel, wenn Sie wissen, dass der maximale Wert von size_t ist nur 2**32 - 1, dann gibt es keinen Sinn zu versuchen zu mmap() eine region, die größer als 1 oder 2 GB.)

Andere Tipps

kurze Antwort: keine

lange Antwort:es hängt davon ab, zu viele OS/compiler-Kombinationen.Zum Beispiel zur Laufzeit, auf linux können Sie die Abfrage der proc-Dateisystem in der Erwägung, dass auf windows, Sie können Abfrage der register.

Sie beweisen können, dass der compiler verwendet werden für die Kompilation verfügt über eine 32/64 bits Gegner mit so etwas wie:

bool is_32bit() {
    return sizeof(int *) == 4;
} 

bool is_64bit() {
    return sizeof(int *) == 8;
} 

könnte dies funktioniert unter einigen Annahmen (z.B.es funktioniert zur Laufzeit).Sie können die Suche für compile-time #define für Ihre Plattform, aber es ist ein gut-bekannt Durcheinander.

Wenn Sie GCC verwenden (wie in der tags), können Sie testen, wie eine compile-time test

#if __SIZEOF_POINTER__ == 8

finden Sie heraus, ob es ein 64-bit-system.Stellen Sie sicher, dass die GCC-version, die Sie verwenden, definiert __SIZEOF_POINTER__ vor der Verwendung es.

Die meisten gemeinsamen Weg ist, zu testen sizeof(void*) und sizeof(int) (beachten Sie, dass Sie nicht unbedingt dasselbe sein muss).

Eine weitere Möglichkeit auf x86/x64-CPUs ist die Prüfung für das 'lm' - flag.Wenn es vorhanden ist die CPU versteht, die den AMD64-Befehlssatz.

Eine sichere und tragbare Technik ist leider nicht möglich (weil sichere und portable können Sie nur die Regeln, die im C-Standard).

sizeof(int) mit einigen der häufigsten Compiler können geben Sie 4 für eine 32-bit-Plattform und 8 für 64-bit-Plattform, aber dies ist nicht garantiert.Alle C-standard sagt, ist, dass ein int sein sollte, die "Natürliche" Größe für Berechnungen auf das Ziel, und so viele Compiler haben Links sizeof(int) 4 auch in einer 64-bit-Welt mit der Begründung, dass es "genug".

sizeof(void*) besser ist da ein Zeiger muss die entsprechende Größe an die Adresse der gesamten Adressraum. sizeof(void*) ist daher wahrscheinlich, geben Sie 4 oder 8 entsprechend.Technisch aber, auch das ist nicht garantiert sizeof gibt die Anzahl der bytes, die benötigt werden, um etwas lagern, und ein byte nicht 8 bits.Ein byte ist technisch das kleinste adressierbare Einheit des Speichers, die nur passiert zu werden 8 bits auf den meisten Plattformen die Nutzer.8-bit-adressierbar ist sehr Häufig, aber ich arbeite mit chips, das sind 16-bit-adressierbar und 16-bit-Wort, Größe (so sizeof(int) 1).Also, wenn Ihr byte-Größe nicht auf 8 bit, dann sizeof(void*) könnte Ihnen eine Vielzahl von Werten.

Auf der anderen Seite, wenn Sie nur versucht zu unterscheiden zwischen x86 und x64 (32-bit und 64-bit-PC-Prozessoren), dann sizeof(void*) ausreichend sein wird, und portabel-Compiler.

32-bit-auf den code, bank-oder 32-bit-auf die Daten-bank.:-) 8086-Prozessoren hatte die 16-bit-Daten mit 20-bit-code-Speicher.Auch moderne Havard Maschinen machen seltsame Dinge mit code - /Daten-Trennung...

Sie könnte überprüfen Sie die cpuid Anleitung für x86-Prozessoren.Andere Prozessor-Familien, die möglicherweise nicht über eine solche Anweisung...YMMV.

int iedx;

__asm
{

mov eax, 0x80000001;
cpuid;
mov, iedx,edx;
}

     if (iedx & (1 << 29))
       {
        return 1;
       }
     return 0;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top