sizeof 演算子 - 特定の型のメモリニーズを決定する
sizeof
演算子は、特定の型の変数によって占有されるバイト数を返します。 セーフ コードでは、sizeof
演算子の引数は、アンマネージ型 の名前であるか、またはアンマネージ型 制約 型パラメーターである必要があります。 アンマネージド型には、すべての数値型、列挙型、タプル型と構造体型が含まれます。すべてのメンバーがアンマネージ型です。
次の表に示す式は、コンパイル時に対応する定数値に評価され、安全でないコンテキストは必要ありません。
表現 | 定数値 |
---|---|
sizeof(sbyte) |
1 |
sizeof(byte) |
1 |
sizeof(short) |
2 |
sizeof(ushort) |
2 |
sizeof(int) |
4 |
sizeof(uint) |
4 |
sizeof(long) |
8 |
sizeof(ulong) |
8 |
sizeof(char) |
2 |
sizeof(float) |
4 |
sizeof(double) |
8 |
sizeof(decimal) |
16 |
sizeof(bool) |
1 |
安全でないコードでは、sizeof
する引数には、制約のない型パラメーターを含むポインター型とマネージド型を含めることができます。 例としては、object
や string
などがあります。
次の例では、sizeof
演算子の使用方法を示します。
public struct Point
{
public Point(byte tag, double x, double y) => (Tag, X, Y) = (tag, x, y);
public byte Tag { get; }
public double X { get; }
public double Y { get; }
}
public class SizeOfOperator
{
public static void Main()
{
Console.WriteLine(sizeof(byte)); // output: 1
Console.WriteLine(sizeof(double)); // output: 8
DisplaySizeOf<Point>(); // output: Size of Point is 24
DisplaySizeOf<decimal>(); // output: Size of System.Decimal is 16
unsafe
{
Console.WriteLine(sizeof(Point*)); // output: 8
}
}
static unsafe void DisplaySizeOf<T>() where T : unmanaged
{
Console.WriteLine($"Size of {typeof(T)} is {sizeof(T)}");
}
}
sizeof
演算子は、マネージド メモリ内の共通言語ランタイムによって割り当てられたバイト数を返します。 構造体 型の場合、前の例で示すように、その値にはパディングが含まれます。 sizeof
演算子の結果は、非管理 メモリ内の型のサイズを返す Marshal.SizeOf メソッドの結果と異なる場合があります。
安全でないコードでは、引数がマネージド型の場合、sizeof
演算子は、その型のインスタンスに割り当てられたバイト数ではなく、参照のサイズを返します。
重要
sizeof
によって返される値は、アンマネージ メモリ内の型のサイズを返す Marshal.SizeOf(Object)の結果とは異なる場合があります。
C# 言語仕様
詳細については、「C# 言語仕様の「sizeof 演算子の」セクションを参照してください。
関連項目
.NET