2013-04-11 14 views
6

Dies ist ein sehr grundlegender Zweifel, den ich habe. Ich bin kein IT- oder CS-Typ, bitte versuchen Sie es in einer einfachen Sprache zu erklären. Jetzt, warum ich diese Frage stelle, ist, dass, weil wir 32 Bit-Anwendungen in 64 & 32-Bit-Betriebssystemen ausführen können. AFAIK die Datentypen für 64 Bit nehmen doppelt so viel Speicher wie 32 Bit Apps. Auch 64-Bit-Apps können nur auf 64-Bit-Betriebssystemen ausgeführt werden. Warum sollten Sie dann 64-Bit-Anwendungen entwickeln? Vielleicht ist deshalb Firefox nur in 32 Bit ??? Sorry, wenn diese Frage nicht auf Augenhöhe mit den Standards von SO ist, aber ich kann einfach nicht aufhören, darüber nachzudenken. Danke.Warum sollten wir 64-Bit-Ziele für C++ - Anwendungen erstellen?

UPDATE: Irgendwie scheint es eine Verwirrung zu geben. Ich wollte nicht fragen, warum wir eine 64-Bit-Architekturmaschine brauchen. Ich weiß, dass 32-Bit-Maschinen nur 4 GB RAM verwenden können & 64-Bit-Maschinen haben viel höhere Grenze. Ich habe gefragt, warum wir 64-Bit-Anwendungen erstellen müssen!

+0

Haben Sie jemals versucht, 150GiB Ram in einem 32-Bit-Prozess zuzuordnen? – PlasmaHH

+4

64-Bit-Anwendungen können auf mehr Speicher zugreifen. Dies ist wichtig für einige Anwendungen, nicht so sehr für andere. – john

+0

@PlasmaHH was ist GiB? ist es mit Giga-Bytes (GB) verwandt? –

Antwort

10

Abgesehen von den oben genannten Gründen (hauptsächlich "mit mehr als 2-3 GB Speicher"), ist der Grund für 64-Bit zu kompilieren, dass x86-64 16 Register hat, wo x86-32 8 hat Eines dieser Register ist der Stackpointer und oft ist rBP für "framepointer" reserviert, die tatsächliche nützliche Anzahl von Registern ist 6 bzw. 14. Die zusätzlichen Register ermöglichen beispielsweise, dass eine größere Anzahl von Parametern in Registern passiert wird und dass eine größere Anzahl von temporären Variablen in Registern innerhalb einer Funktion gehalten wird. Dies wirkt sich positiv auf die tatsächliche Ausführungsgeschwindigkeit des Codes aus, da jedes Mal, wenn anstelle eines Registers ein Speicher verwendet wird, dies zu einem komplexeren Befehl führt und oft zu einem zusätzlichen Befehl, der verwendet werden muß. Dies wiederum macht den Code größer, wenn nicht genügend Register vorhanden sind.

Im Allgemeinen läuft 64-Bit-x86-Code um 5-15% schneller ohne Änderungen an den tatsächlichen Algorithmen und hat in der Regel. Manchmal können Algorithmen geändert werden, um viel mehr zu erreichen [weil Sie beispielsweise ein Array haben können, das durch "Telefonnummer" indiziert wird, anstatt die Telefonnummer zu hashen und dann auf dem Hash zu indizieren oder stattdessen 64-Bit-Integer-Werte zu verwenden von 32-Bit-Einsen, was eine Beschleunigung von 2x für "halb so viele Operationen" bedeutet.

Wenn es Leistung ist, die Sie von der Anwendung benötigen, müssen Sie einen Benchmark (auf mehreren Plattformen). Es gibt Situationen, in denen z. B. größere Zeiger bedeuten, dass der Cache schneller voll wird und der Code langsamer läuft, weil "nur halb so viele verknüpfte Listeneinträge in den Cache passen".

Kurz gesagt: In den meisten Fällen sind 64-Bit-Apps schneller als 32-Bit-Apps, die dasselbe tun.

+0

32-Bit-Anwendungen können 4 GB auf 64-Bit-Windows mit \ LARGEADDRESSAWARE wechseln: http://support.microsoft.com/default.aspx?scid=889654 – EdChum

+1

Und sie können mehr als 4 GB mit [AWE] (http: //msdn.microsoft.com/en-us/library/windows/desktop/aa366527(v=vs.85).aspx) – dyp

+1

Ja, beide sind wahr (naja, es ist "knapp unter 4GB", aber für alle Absichten und Zwecke ist es 4GB). AWE gibt dir keinen großen Speicher, aber der Code muss durch die Sprünge springen, um den Speicher zu verwenden, was keine gute Lösung ist. –

6

Der wichtigste Anwendungsfall ist, wenn Sie wirklich mehr als 2 Gigabyte Speicher für Ihren Prozess verbrauchen möchten.

Die nächste Sache ist, dass die 32-Bit-Unterstützung langsam abnimmt, so wie Sie jetzt nicht viele 16-Bit-Anwendungen sehen werden. Dies ist jedoch ein langsamer Prozess. Derzeit gibt es eine Version von Windows Server 2008, die standardmäßig keine 32-Bit-Unterstützung bietet.

Und schließlich manchmal müssen Sie nur 64-Bit sein - das ist, wenn Sie eine Erweiterung jeder Art erstellen, die in einen 64-Bit-Consumer-Prozess geladen wird. Da 64-Bit-Prozesse keinen 32-Bit-Code laden können, müssen Sie eine 64-Bit-Erweiterung bereitstellen oder eine Interop-Lösung erstellen, um Ihren Code in einem separaten Prozess zu speichern. Letzteres ist nicht immer möglich und manchmal sehr ineffizient.

+0

Vielen Dank für Ihre einfache Antwort, wie ich gefragt hatte. Allerdings konnte ich den 3. Absatz nicht verstehen. –

+0

@Cool_Coder: Welches Ding genau verstehst du nicht? – sharptooth

+0

32-Bit-Anwendungen können mit dem Schalter \ LARGEADDRESSAWARE auf 4 GB auf 64-Bit-Fenstern zugreifen: http://support.microsoft.com/default.aspx?scid = 889654 – EdChum

4
  • Physikalischer Speicher

Eine 32-Bit-Systemarchitektur direkt nur einen 4-GB-Adressraum adressiert. Eine 64-Bit-Systemarchitektur, auf der eine 64-Bit-Edition von Windows Server ausgeführt wird, unterstützt bis zu 1.024 GB physischen und adressierbaren Arbeitsspeicher.

  • bessere Parallelverarbeitung

Ein Server, der 32-Bit-Architektur verwendet wird, begrenzt (Windows OS) zu 32 CPUs. Verbesserungen in der Parallelverarbeitung und in der Busarchitektur ermöglichen 64-Bit-Umgebungen die Unterstützung von bis zu 64 Prozessoren und bieten mit jedem zusätzlichen Prozessor eine nahezu lineare Skalierbarkeit.

  • Faster Busarchitektur

Ein 64-Bit-Architektur mehr und breitere Allzweckregister, die insgesamt eine höhere Applikationsgeschwindigkeit beitragen liefert. Wenn mehr Register vorhanden sind, müssen weniger persistente Daten in den Speicher geschrieben werden und müssen dann nur ein paar Anweisungen später zurückgelesen werden. Funktionsaufrufe sind auch in einer 64-Bit-Umgebung schneller, da bis zu vier Argumente gleichzeitig in Registern an eine Funktion übergeben werden können.

+0

Emm ... Warum ist ein 32-Bit-Server auf 32 CPUs begrenzt, frage ich mich? – sharptooth

+1

Ich habe es hier gefunden: http://technet.microsoft.com/en-us/library/dd630755%28v=office.12%29.aspx – duDE

+0

Das ist einige Windows-spezifische Einschränkung. – sharptooth

1

Die Größe der Datentypen wird nicht automatisch mit x64 verdoppelt, aber die Größe der Prozessoren wird registriert, genau wie die Zeigergröße.Mit 32 Bits können Sie 4294967295 Bytes Speicher adressieren (~ 4 Gb), was für einige Anwendungen (wie Datenbank-Management-Systeme, ...) nicht ausreicht.

Firefox ist nur in 32-Bit verfügbar, wegen Kompatibilitätsproblemen. Sie können keine Bibliotheken für x86 (32 Bit) -Architekturen schreiben und sie von x64-Prozessoren aus aufrufen, da ihre Zeiger inkompatibel sind (wie oben beschrieben). Das Erstellen von beiden: x64 und X 86-Versionen erhöht Testaufwand. Wenn Ihre Anwendung selten mehr als 3,5 GB Arbeitsspeicher verwendet, profitiert sie nicht wirklich von x64-Architekturen.

Auch 32-Bit-Programme können nicht einfach auf x64-Architekturen laufen. Unter Windows gibt es hierfür eine Schicht namens Windows on Windows (WoW) oder WoW64 für x64/x86-Schnittstellen. Durch verschiedene Caching-Fälle kann es auch sein, dass eine x86-Anwendung auf WoW tatsächlich schneller läuft als eine native x64-Anwendung, die dasselbe tut.

+0

Hey @Aschratt danke für diese Info, das wusste ich nicht. Also Windows hat diese Spezialität nur von 32-Bit-Anwendungen auf 64-Bit-Betriebssystem ausführen? Doesnt 64 Bit Ubuntu laufen 32-Bit-Apps standardmäßig. Ich frage, weil ich es nicht weiß. –

+0

Ich weiß nicht, ob Linux (oder Ubuntu) eine solche Abstraktionsschicht hat. Grundsätzlich "simuliert" WoW64 einen x86-Prozessor für den x86-Prozess. Dies ist nicht sehr schwierig, da die meisten Opcodes die gleichen sind. Sie müssen nur die Zeiger korrigieren. Ich denke, es gibt etwas Ähnliches für Ubuntu, aber ich weiß es wirklich nicht. – Carsten

Verwandte Themen