Wenn ich in meinem C# .NET Projekt sizeof(int)
mache, bekomme ich einen Rückgabewert von 4. Ich setze den Projekttyp auf x64, also warum sagt es 4 statt 8? Liegt das daran, dass ich verwalteten Code ausführe?sizeof (int) auf x64?
Antwort
Es gibt various 64-bit data models; Microsoft verwendet LP64 für .NET: Sowohl als auch s und Zeiger sind 64-Bit (obwohl traditionelle C-style Zeiger nicht existieren. NET). Vergleichen Sie dies mit ILP64, wobei int s auch 64-Bit sind.
Somit ist auf allen Plattformen int
32-Bit und long
ist 64-Bit; Sie können dies in den Namen der zugrunde liegenden Typen System.Int32 und System.Int64 sehen.
Sie sollten Ihre Antwort so bearbeiten, wie sie akzeptiert wird, um sie vollständig zu korrigieren. Entfernen Sie, wo Sie sagen, "obwohl traditionelle C-Style-Zeiger nicht existieren." Und Detail System.IntPtr hängt von der Architektur ab. –
Sie können "C-style" -Zeiger in C# verwenden, sie müssen nur im unsicheren Kontext ausgeführt werden.Wie "fnieto" sagte, müssen Sie beachten, dass IntPtr hängt von der Plattform ab, wo "sizeof (IntPtr) == 4" in x86 & "sizeof (IntPtr) == 8" in x64. – zezba9000
Das Schlüsselwort int
Aliase System.Int32
, die immer noch 4 Bytes benötigt, sogar auf einer 64-Bit-Maschine.
int
bedeutet Int32
in .NET-Sprachen. Dies wurde für die Kompatibilität zwischen 32- und 64-Bit-Architekturen getan.
Hier ist die table of all the types in C# und was sie .NET-weise zuordnen.
Denken Sie daran, int
ist nur ein Compiler-Alias für den Basistyp Int32
. Angesichts der Tatsache, dass es offensichtlich sein sollte, warum int
nur 32 Bits auf einer 64-Bit-Plattform ist.
Vielleicht denken Sie an einen Zeiger int
oder System.IntPtr
. Das wären 8 Bytes auf einem x64 und 4 Bytes auf einem x86. Die Größe eines Zeigers zeigt, dass Sie 64-Bit-Adressen für Ihren Speicher haben. (System.IntPtr.Size
== 8 auf x64)
Die Bedeutung von int
ist immer noch 4 Bytes, ob Sie auf einem x86 oder einem x64 sind. Das heißt, ein int
entspricht immer System.Int32
.
Ein Int32
ist 4 Bytes auf x86 und x64. Ein Int64
ist 8 Bytes in beiden Fällen. Der C# int
Typ ist nur ein Alias für System.Int32
. Dasselbe gilt für beide Laufzeitumgebungen. Die einzige Art, die auf der Laufzeitumgebung abhängig ändert ein IntPtr
:
unsafe
{
var size = sizeof(IntPtr); // 4 on x86 bit machines. 8 on x64
}
Oder Sie können nur IntPtr.Size überprüfen, die keinen unsicheren Code erfordert. –
... und UIntPtr, natürlich. ... und unsichere Zeigertypen. –
Gut zu beachten: UIntPtr ist nicht CLS-konform. –
int i;
int size = BitConverter.GetBytes(i).Lenght;
Nicht verwalteter Code trifft die gleiche Entscheidung wie .NET. In normalem C++ ist sizeof (int) ebenfalls 4. Stellen Sie sich x64 als Erweiterung einer 32-Bit-Architektur vor. Der Standardwert ist 32, Sie können jetzt auch 64-Bit-Daten verarbeiten *. – jalf
@jalf, um genau zu sein, hatten wir bereits die Möglichkeit, 64-Bit-Daten zu verarbeiten, aber die x64-CPUs machen es aufgrund der nativen Unterstützung schneller. –
Warum ist das geschlossen? Obwohl die Frage technisch identisch ist, geht es um Java, hier geht es um .NET/C#. –