Frage

Vor kurzem war ich kürzlich in einem Interview mit einem String-Manipulation Problem herausgefordert und bat um die Leistung zu optimieren. Ich hatte einen Iterator zu verwenden, um hin und her zwischen TCHAR Figuren zu bewegen (mit UNICODE-Unterstützung - 2 Bytes pro Stück).

wirklich nicht von der Array-Länge zu denken, machte ich einen Kurien Fehler mit nicht size_t verwenden, aber ein int durchlaufen. Ich verstehe es nicht kompatibel ist und nicht sicher.

int i, size = _tcslen(str);    
for(i=0; i<size; i++){
   // code here
}

Aber der maximale Speicher wir vergeben können, ist begrenzt. Und wenn es eine Beziehung zwischen int und Registergrößen, kann es sicher sein, eine ganze Zahl zu verwenden.

Z. B .: Ohne virtuelle Mapping-Tools können wir Karte nur 2 ^ registrieren Größe bytes. Da TCHAR 2 Bytes lang, die Hälfte dieser Zahl. Für jedes System, das int als 32-Bit hat, wird dies wird nicht ein Problem sein, auch wenn Sie eine nicht signierte Version von int nicht verwenden. Früher mit eingebetteten Hintergrund von int als 16-Bits zu denken, aber die Speichergröße wird auf einem solchen Gerät eingeschränkt werden. Also ich frage mich, ob es eine architektonische Feinabstimmung Entscheidung zwischen integer ist und Größen registrieren.

War es hilfreich?

Lösung

Der C ++ Standard spezifiziert nicht die Größe eines int. (Er sagt, dass sizeof(char) == 1 und sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long).

So gibt nicht Haben , um eine Beziehung zu Größe zu registrieren. Eine vollständig konforme C ++ Implementierung könnten Sie 256-Byte-Zahlen auf Ihrem PC mit 32-Bit-Registern. Aber es wäre ineffizient.

Also ja, in der Praxis die Größe des int Datentypen im allgemeinen gleich ist, auf die Größe der allgemeinen Register der CPU, da diese bei weitem der effizienteste Möglichkeit ist.

Wenn ein int ist größer als ein Register, dann einfache arithmetische Operationen würden mehr als einen Befehl erfordern, die kostspielig wäre. Wenn sie kleiner als ein Register waren, dann geladen und die Werte eines Registers zu speichern würde das Programm benötigen, um die ungenutzten Bits zu maskieren, zu vermeiden, dass andere Daten überschrieben werden. (Deshalb ist der int Datentyp der Regel effizienter als short ist.)

(Einige Sprachen benötigen lediglich eine int 32-Bit zu sein, in diesem Fall gibt es offensichtlich keine Beziehung Größe registrieren --- anders als das 32-Bit gewählt, weil es sich um ein gemeinsames Register Größe)

Andere Tipps

streng von der Norm geht, gibt es keine Garantie, wie groß / klein ein int ist, viel weniger eine Beziehung zu der Registergröße. Außerdem haben einige Architekturen verschiedene Größen von Registern (das heißt: nicht alle Register auf der CPU sind gleich groß) und Speicher ist nicht immer zugegriffen mit nur ein Register (wie DOS mit seinem Segment: Offset-Adressierung). Mit allem, was gesagt, aber in den meisten Fällen int ist die gleiche Größe wie das „normale“ Register, da sie den am häufigsten verwendeten Basistyp sein sollte sind und das ist, was CPUs optimiert ist für den Betrieb auf.

AFAIK, gibt es keine direkte Verbindung zwischen Registergröße und der Größe des int.

Da Sie wissen, für welche Plattform Sie die Anwendung sind kompilieren, können Sie Ihre eigene Art alias mit den Größen definieren Sie brauchen:

Beispiel

#ifdef WIN32 // Types for Win32 target
#define Int16 short
#define Int32 int
// .. etc.
#elif defined // for another target

Verwenden Sie dann die deklarierten Aliase.

Ich bin nicht völlig bewusst, wenn ich diese richtig verstehen, da einige andere Probleme (Speichergrößen, Zuordnung, registrieren Größen Leistung?) Gemischt werden hier.

Was könnte ich sagen, ist (nur die Überschrift nehmen), dass auf den meisten aktuellen Prozessoren für maximale Geschwindigkeit sollten Sie ganze Zahlen verwenden, die Größe registrieren lassen. Der Grund dafür ist, dass, wenn kleinere ganze Zahlen verwenden, Sie haben den Vorteil, weniger Speicher benötigen, und zum Beispiel auf der x86-Architektur, ein zusätzlicher Befehl für die Konvertierung erforderlich ist. Auch auf Intel haben Sie das Problem, dass (meist auf Register-sized Grenzen) Speicher nicht ausgerichtete Zugriffe werden einige penality geben. Aus natürlich auf der heutigen Prozessoren sind die Dinge noch komplizierter, da die CPUs können Befehle parallel verarbeiten. So können Sie für einige Architektur Feinabstimmung am Ende.

So die beste Vermutung - ohne die architectore zu wissen -. Speeedwise heißt, verwenden Größe Ints registrieren, wie lange können Sie den Speicher leisten

Ich habe nicht eine Kopie des Standard, aber meine alte Kopie von Die Programmiersprache C sagt (Abschnitt 2.2) int bezieht sich auf „eine ganze Zahl, in der Regel die natürliche Größe von ganzen Zahlen reflektierte die Host-Maschine.“ Meine Kopie von The C ++ Programming Language sagt (Abschnitt 4.6) "der int Typ soll gewählt werden, die am besten geeignet zu sein, zum Halten und Manipulieren ganzer Zahlen auf einem bestimmten Computer."

Du bist nicht die einzige Person, zu sagen: "Ich gebe zu, dass die dies technisch ein Fehler ist, aber es ist nicht wirklich verwertbar . "

Es gibt verschiedene Arten von Registern mit verschiedenen Größen. Was wichtig sind die Adressregister, nicht den allgemeinen Zweck diejenigen. Wenn die Maschine 64 Bit ist, dann sind die Adreßregister (oder eine gewisse Kombination davon) müssen 64-Bit sein, auch wenn die Universalregister sind 32-Bit. In diesem Fall kann der Compiler hat einige zusätzliche Arbeit zu tun, tatsächlich 64-Bit-Adressen berechnen mehrere Universalregister verwendet wird.

Wenn Sie nicht denken, dass die Hardware-Hersteller immer ungeradee Design-Entscheidungen für ihre Register machen, dann werden Sie wahrscheinlich noch nie mit dem Original 8086 beschäftigen „ real-Modus " Adressierung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top