sizeof operátor – určení potřeb paměti pro daný typ
Operátor sizeof
vrátí počet bajtů obsazených proměnnou daného typu. V bezpečném kódu musí být argument operátoru sizeof
název nespravovaného typu nebo parametr typu, který je omezený být nespravovaný typ. Nespravované typy zahrnují všechny číselné typy, typy výčtů a typy řazené kolekce členů a struktury, kde všechny členy jsou nespravované typy.
Výrazy uvedené v následující tabulce se vyhodnocují v době kompilace s odpovídajícími konstantními hodnotami a nevyžadují nebezpečný kontext:
Výraz | Konstantní hodnota |
---|---|
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 |
V nebezpečném kódu může argument sizeof
obsahovat typy ukazatelů a spravované typy, včetně neomezených parametrů typu. Příklady zahrnují object
a string
.
Následující příklad ukazuje použití operátoru 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)}");
}
}
Operátor sizeof
vrátí počet bajtů přidělených modulem CLR (Common Language Runtime) ve spravované paměti. Pro typy struktury, tato hodnota zahrnuje veškerou výplň, jak ukazuje předchozí příklad. Výsledek operátoru sizeof
se může lišit od výsledku Marshal.SizeOf metody, která vrátí velikost typu v nespravované paměti.
Pokud je argument spravovaným typem, vrátí operátor sizeof
v nezabezpečeném kódu velikost odkazu, nikoli počet bajtů přidělených pro instanci tohoto typu.
Důležitý
Hodnota vrácená sizeof
se může lišit od výsledku Marshal.SizeOf(Object), který vrátí velikost typu v nespravované paměti.
Specifikace jazyka C#
Další informace najdete v tématu Oddíl operátoru sizeof specifikace jazyka jazyka C#.