2009-08-24 5 views
0

Ich meine, von dem, was ich verstehe, wird ein int (Int32) von -2.147.483.648 zu 2.147.483.647 gehen. Wenn ich mich richtig erinnere, wird sich jedes Programm unter Windows auf 32Bits so verhalten, wie es 2GB RAM hat, also würde ich sagen, dass ich jede Adresse "innerhalb" eines int32 setzen kann. Ist das wahr? Oder sollte ich bei Uint bleiben? Ich weiß, dass Uint nur für positive ganze Zahlen ist, und dass alle Speicheradressen positive ganze Zahlen sind, aber meine Frage bezieht sich mehr auf "passt jede Speicheradresse in ein int32?".Wenn Sie mit dem Speicher des Prozesses arbeiten, gibt es einen Grund, uint statt int zu verwenden?

Dank

edit: von MSDN i Readprocessmemory sehen (http://msdn.microsoft.com/en-us/library/ms680553(VS.85).aspx) akzeptiert ein size_t Argument für die Basisadresse. Was bildet ein size_t in .net ab?

edit2: Ok, jetzt bin ich irgendwie verwirrt. Scheint, dass ich 100% sicher sein sollte, sollte ich statt der Ints verwenden. Wenn ich also interop benutze, sollte ich UIntPtrs anstelle von IntPtrs verwenden. Aber ich sehe überall Leute, die IntPtrs benutzen. Warum das? Muss es sein, dass all die Dinge, die wir normalerweise verwenden, in den ersten 2 GB des Speichers sind, also gibt es kein Problem bei der Verwendung von Standard-Ints?

+1

Diese beantwortet Ihre Frage zu size_t http://stackoverflow.com/questions/772531/net-equivalent-of-sizet – DmitryK

+0

nicht zu viel in die „Int“ Teil lesen Sie „IntPtr.“ Es ist ein Hinweis, kein Versprechen eines Implementierungsdetails. IntPtr verarbeitet das, was Sie wollen, in einer Bissen-unabhängigen Weise. –

+0

Ich benutzte Reflektor, um in die Implementierung von IntPtr zu schauen. Obwohl es nicht so aussieht, als wäre es darauf beschränkt, int und int zu halten, werden alle ToString(), ToInt32() und sogar ToInt64() intern zuerst den internen Wert in int umwandeln und erst danach in to string und lang jeweils. So scheint IntPtr tatsächlich NUR für Ints zu sein, während UIntPtr in der Tat zu uints ist! –

Antwort

2

Ich glaube, das Limit ist 4Gb nicht 2Gb für 32bit Maschinen/Prozesse. Aber kann erweitert werden, wenn Sie AWE verwenden. Daher wäre Int32 zum Speichern einer Speicheradresse nicht geeignet. Aber wenn Sie nicht irgendeine Art von Interop machen, ist es wahrscheinlich nicht angemessen, Speicheradressen direkt zu speichern.

Edit: Also zum Lesen eines fremden Prozesse Speicher, die eine Form der Interop ist, würde ich definitiv eine vorzeichenlose Ganzzahl verwenden.

+0

Ich lese den Speicher eines fremden Prozesses. –

+1

AWE ändert die Speichergröße nicht.Es (Adressfenstererweiterung) ermöglicht es Ihnen, ein Fenster innerhalb eines 4 GB adressierbaren Speicherplatzes auf etwas außerhalb (höher als 4 GB in physischem RAM) abzubilden, aber für den Prozess wird es immer noch innerhalb von 4 GB aussehen. – DmitryK

+0

Also von was ich verstehe, sollte ich Usints verwenden. Nun, da dies pointerbezogen ist, verwende ich UIntPtr anstelle von IntPtrs, richtig? –

3

In einer 32-Bit-Architektur kann ein 32-Bit-Zeiger 4 GB RAM adressieren. in der Regel ist dieser Speicher aufgeteilt 2 GB (unterer Teil) wird dem Prozess gegeben, während die höheren 2 GB dem Betriebssystem gegeben ist. Sie können dieses Verhalten ändern, indem Sie in der Datei boot.ini einen Schalter/3GB verwenden, der dem Benutzer 3 GB und dem Betriebssystem 1 GB zur Verfügung stellt. Also ich würde dringend empfehlen unsigned Ganzzahlen.

2

Bearbeiten: Eigentlich wird UIntPtr nicht von Microsoft empfohlen. Zurückschalten auf IntPtr. (Forschung, die "besser" war, warum es so lange dauerte, um überhaupt zu antworten!))

Auch size_t sollte in .NET System.IntPtr zugeordnet werden. Dies liegt daran, dass sowohl size_t als auch System.IntPtr plattform-/bititätsabhängig sind. Die Tatsache, dass eine size_t eine 32-Bit-Ganzzahl ist, ist ein Implementierungsdetail - indem Sie mit System.IntPtr gehen, können Sie Ihre Anwendung effektiv zukunftssicher machen. Siehe this StackOverflow question.

+0

Das heißt also, wenn ich IntPtr benutze, werde ich immer sicher sein, oder? –

+0

"Sicher" ist ein relativer Begriff, aber "IntPtr" ist die * korrekte * Möglichkeit, sich Ihrem Entwurf zu nähern. Ich zögere, das Wort sicher zu verwenden, da es im Allgemeinen nicht wirklich sicher ist, den Speicherplatz eines anderen Prozesses zu durchsuchen. :) –

Verwandte Themen