Favicon

Sizeof operator

Peponi11/21/20242m

C#
SyntaxOperatorsizeofMarshal.SizeOf

1. Introduction

sizeof 연산자는 주어진 형식의 크기를 byte 단위로 반환한다. sizeof에 사용 가능한 형식은 비관리형 형식이다. 관리 메모리 영역에 할당될 byte 수를 반환하며, 컴파일 타임에 상수 값으로 계산된다. 또한 메모리 레이아웃 규칙에 따라 sizeof에 의해 예상되는 크기가 실제와는 다를 수 있다.

메모리 레이아웃 규칙에 대한 자세한 내용은 Data structure alignment (Memory layout)를 참조한다.

public struct Test
{
   public bool A;
   public short B;
}
 
static void Main(string[] args)
{
    unsafe
    {
        Console.WriteLine(sizeof(Test));    // 예상 크기 : 3
    }
}
 
/* output:
4
*/

2. Marshal.SizeOf

일반적으로는 sizeof 연산자 대신 Marshal.SizeOf 메서드를 사용한다. 런타임에 동작하는 Marshal.SizeOf() 메서드는 값 형식과 참조 형식 모두 사용 가능하며 비관리 메모리 영역에 할당될 byte 수를 반환한다. 클래스의 경우에는 LayoutKind.Sequential 또는 LayoutKind.Explicit 선언을 해주어야 한다.

public struct Test
{
   public bool A;
   public short B;
}
 
static void Main(string[] args)
{
    unsafe
    {
        Console.WriteLine(sizeof(Test));
    }
    Console.WriteLine(Marshal.SizeOf<Test>());
}
 
/* output:
4
8
*/

3. 값 형식의 기본 크기

C# 의 값 형식에 따른 기본 크기는 다음 테이블과 같다.

형식값 (bytes)
sbyte1
byte1
bool1
char2
short2
ushort2
int4
uint4
long8
ulong8
float4
double8
decimal16

4. 참조 자료