본문 바로가기
Study

C#, 포인터의 크기 (Pointer size)

by Client. DJ 2023. 12. 29.
반응형

포인터의 크기

일반적인 데이터형에 따른 메모리 사이즈말고도 할당으로 인해서 생기는 메모리도 존재합니다. 우리는 이것을 포인터라고 표현합니다. 보통 변수를 선언할 때는 메모리로부터 할당을 받습니다. 우리가 클래스를 만들고, 클래스를 할당 받으면 메모리가 어떻게 얼마나 생기는지 예측할 수가 있기도하고, 필요할 때만 받을 수 있게 정확히 구분 지어 사용이 가능합니다.

할당으로 생기는 메모리 크기는 "4byte"

통상적으로 메모리 크기는 4byte입니다. 언어 환경 또는 빌드 때 시스템 환경이 32비트냐 64비트냐에 따라 8byte가 되기도 합니다. 이는 포인터에 값이 들어있으면 존재하고, null이면 존재하지 않습니다.

예제

아래와 같은 클래스들이 있습니다.

public class A
{
    public string str = null;  // 0byte
}

public class B
{
    public A a = new A();	// 4byte
}

public class C
{
    public B b = new B();	// 4byte
}

아래와 같이 'C' 클래스를 할당하면 총 12byte의 메모리 영역을 생성합니다.

 

public class Program
{
    public static void Main(string[] args)
    {
        C c = new C();	// 4byte
    }
}

'C'를 생성할 때 4btye , 'B'를 생성할 때 4byte, 'A'를 생성할 때 4byte 도합 12byte가 됩니다. 하지만 'A' 안의 string 변수는 null로 선언되었기 때문에 메모리 영역을 생성하지 않았습니다.

C#의 편리함에서 오는 실수

C++의 경우 포인터 변수를 따로 받아서 쓰고, 이를 할당받아서 직접 해제까지 하는 과정이 있어서 포인터 메모리에 대해 관리가 이루어지지만, C#의 경우 가비지 컬렉터에 의존하기 때문에 놓치기 쉽습니다. 심지어 위의 예시처럼 클래스 멤버 변수에 바로 할당이 가능하기 때문에, 생성 하는 순간 내부에 또 다른 할당들로 인해 쓸모 없는 메모리를 영역을 잡는 경우가 있습니다. 단순히 4byte라고 생각할 수 있지만, 이 클래스를 배열 또는 리스트로 만들어서 사용하는 순간 메모리 양은 배가 될 수 있기에 항상 주의하며 클래스 설계를 하여야합니다.

반응형

댓글