次の方法で共有


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を使用できます。

  • アンマネージ型に 制約されている 型パラメーターは、実行時にそのアンマネージ型のサイズを返します。
  • マネージド型またはポインター型は、参照するオブジェクトのサイズではなく、参照またはポインターのサイズを返します。

次の例では、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 によって返される値は、アンマネージ メモリ内の型のサイズを返す Marshal.SizeOf(Object)の結果とは異なる場合があります。

C# 言語仕様

詳細については、「C# 言語仕様の「sizeof 演算子の」セクションを参照してください。

関連項目