Was ist ein langer Zeiger?

Lesezeit: 4 Minuten

Benutzeravatar von Numerical25
numerisch25

Ich lese ein Buch und es erwähnt einen bestimmten Datentyp als langen Zeiger. Nur neugierig, was das bedeutete. Vielen Dank.

Benutzeravatar von Thomas Matthews
Thomas Matthäus

Einige Prozessoren haben zwei Arten von Zeigern, einen nahen Zeiger und einen fernen Zeiger. Der Nahzeiger ist schmaler (hat also eine begrenzte Reichweite) als ein Fernzeiger. Ein Far-Zeiger kann auch ein Long-Zeiger sein.

Einige Prozessoren bieten eine relative Adressierung für Dinge in der Nähe. Ein langer Zeiger kann darauf hinweisen, dass das Element nicht in der Nähe ist und eine relative Adressierung nicht verwendet werden kann.

In jedem Fall sind lange Zeiger ein plattformspezifisches Problem und möglicherweise nicht auf andere Betriebssysteme oder Plattformen übertragbar.

Bearbeiten: (weitere Erklärung und Verwendung der relativen Adressierung)

Adressentfernungen sind weniger ein Konzept auf hoher Ebene als vielmehr ein Konzept der Assemblersprache. Das Distanz wird vom Programmzähler (entweder die aktuelle Adresse oder die nächste Adresse) und dem Beginn des Objekts (Funktion oder Daten) gemessen. Wenn die Position größer als die Grenze für einen kleinen, relativen Zeiger ist, ist ein längerer Zeiger erforderlich.

Beispiel: Gegeben sei ein System mit 32 Bit “langer” Adressierung und 8 Bit relativer Adressierung. Der relative Abstand würde mindestens 127 Bytes in Vorwärtsrichtung (positiver Wert) oder vorheriger (negativer) Richtung zulassen. Wenn das Ziel 1024 Bytes entfernt ist, muss ein vollständiger 32-Bit-Zeiger verwendet werden.

Dies ist eine Optimierungsfunktion, die auf dem Konzept basiert, dass die meisten Anweisungen und Daten in der Nähe sind. Die meisten Schleifen haben einen kleinen Abstand zwischen Schleifenanfang und Schleifenende. Diese verwenden zur Ausführung eine relative Adressierung.

Die meisten Daten sind in der Nähe, egal ob es sich um eine Datenkonstante oder eine Variable handelt. Genauer gesagt sind die Daten in der Nähe von a rahmen oder Bezugspunkt. Lokale Variablen werden relativ zu einem Rahmen oder einer Basisadresse auf dem Stapel platziert. Diese Basisadresse ist der Anfang des Stapels bevor die Funktion ausgeführt wird. Somit kann auf die Daten zugegriffen werden, indem eine Adressierung relativ zum Stack-Frame-Start verwendet wird.

Die Prozessoren ermöglichen es Compilern, spezialisierte Anweisungen für die relative (nahe) Adressierung zu verwenden. Bei vielen Prozessoren sind die Anweisungen zur Verwendung einer relativen Adressierung kleiner als Anweisungen, die eine lange Adresse verwenden. Somit erfordert der Prozessor weniger Abrufen aus dem Befehls-Cache und der Befehls-Cache kann mehr Befehle halten.

Lang und kurz, nah und fern, die Adressierung kann von der abhängen Umfang der Daten oder Funktion. Es sind andere Faktoren beteiligt, wie ein PIC (positionsunabhängiger Code), virtueller Speicher und Paging.

  • Wird diese Entfernung durch ihren Umfang gemessen? Wie oft ist es eingekapselt? Vielen Dank!

    – numerisch25

    23. Februar 2010 um 0:35 Uhr

  • @numerical25: Bitte erklären Sie “Wie oft ist es gekapselt?”. Die Adressierung ist nicht gekapselt.

    – Thomas Matthäus

    23. Februar 2010 um 1:16 Uhr

  • “Scope” existiert auf dieser Ebene nicht mehr – nur ein langes Array von Bytes. Ihr gesamter Code wird in Assembler übersetzt, und das wird im Speicher angelegt. Wenn die Dinge nahe genug beieinander liegen, generiert der Compiler Near-Zeiger, wenn sie weiter entfernt sind, muss der Compiler Far-Zeiger generieren.

    – Justin Smith

    23. Februar 2010 um 3:22 Uhr

  • Wenn Sie diese Antwort ablehnen, hinterlassen Sie bitte eine Erklärung. Vielen Dank.

    – Thomas Matthäus

    5. Januar 2020 um 19:11 Uhr

Je nachdem, wie alt das Buch ist, könnte es sich auf segmentierte Architekturen beziehen, bei denen es zwei verschiedene “Größen” von Zeigern gab: nahe Zeiger, die auf das lokale Segment zeigten (und in 16 Bits eingepasst werden konnten) und weit oder lang Zeiger, die in ein anderes Segment zeigen könnten (und daher größer waren). Aus diesem Grund sehen Sie Typen wie LPVOID in der Win32-API: LPVOID ist ein “langer (weiter) Zeiger auf void”, dh ein Zeiger auf eine beliebige Stelle im Speicher.

Die Verwendung von LP und NP ist ein Überbleibsel von Win16 und den damaligen segmentierten Prozessorarchitekturen. In modernem Windows mit seinen flachen virtuellen Adressräumen sind Nah- und Fernzeiger im Allgemeinen nur von archäologischem Interesse: Es gibt nur eine Art von Zeigern, und Sie können die „Nah“- und „Lang/Fern“-Qualifizierer ignorieren.

  • Das Buch verwendet Direct X 9, MSVS C++ 2008 Express. Copyright 2010. Und einige der Datentypen beginnen mit LP. Aber ich bekomme 2 verschiedene Antworten, also vermute ich, dass sie 2 verschiedene Dinge bedeuten können

    – numerisch25

    23. Februar 2010 um 0:33 Uhr


  • Vielleicht könnten Sie eine der Erwähnungen im Kontext posten (z. B. den Satz, in dem sie vorkommt) – wir könnten dann die Bedeutung in diesem Kontext genauer erläutern. Ist es zB nur eine Randnotiz, die erklärt, warum einige der Datentypen das LP-Präfix haben?

    – itowlson

    23. Februar 2010 um 0:49 Uhr


  • Für eine Definition der Segmentierung werde ich den Weg des Feiglings nehmen und Sie auf Wikipedia verweisen: en.wikipedia.org/wiki/X86_memory_segmentation

    – itowlson

    23. Februar 2010 um 0:52 Uhr

  • @numerical25: der Grund dafür LP wird immer noch in den Namen von Zeigertypen verwendet (wie LPDWORD) ist nur ein Vermächtnis aus den Win16-Tagen – an LPDWORD auf Win32 ist nur ein Zeiger. Unter Win16 ist es ein „langer“ oder „weiter“ Zeiger, aber diese Unterscheidung gibt es in Win32 nicht mehr. Es ist immer noch im Typnamen vorhanden, sodass Code, der für Win16 geschrieben und/oder aus dieser Ära kopiert wurde, problemlos portiert werden kann. Das war damals, als Win32 aufkam, enorm wichtig.

    – Michael Burr

    23. Februar 2010 um 1:31 Uhr

1400870cookie-checkWas ist ein langer Zeiger?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy