unsafe 키워드

C# 포인터

  • C# 대부분의 코드는 확인할 수 있는 안전한 코드
    • .Net 도구에서 코드가 안전한지 확인 가능
    • 원시 메모리를 할당하지 않고, 포인터로 직접 메모리에 엑세스하지 않음
    • 경우에 따라 앱의 성능을 향상
    • 포인터가 필요한 네이티브 함수를 호출하는 경우 필수
    • 보안 및 안전성 이슈 발생 가능성
    • 컴파일 옵션에서 AllowUnsafeBlocks를 사용
// 동일한 선언에서 여러 포인터를 선언하는 경우
int* p1, p2, p3;   // Ok: p1, p2, p3 모두 int* 타입
int *p1, *p2, *p3; // Invalid in C# (C/C++ 방식 불가능)

unsafe 키워드

  • unsafe 키워드를 이용해 확인할 수 없는 코드를 작성
  • 프로그래머가 직접 ptr를 관리할 수 있게 해주는 키워드
  • GC가 해당 메모리 주소를 재배치 할 수도 있기 때문에 위험
    • fixed 키워드를 이용해 이를 방지
// unsafe 키워드를 추가함으로써 포인터 매개 변수 사용 가능
unsafe static void FastCopy ( byte* ps, byte* pd, int count ) {...}

unsafe
{
    // scope 안에서 포인터를 사용 가능
}

컴파일 에러가 난다면?

  • error CS0227가 발생한다면 빌드 옵션을 확인하자
    • https://overface.tistory.com/8

fixed 키워드

  • fixed는 메모리를 고정 시켜주기 때문에 unsafe 와 함께 사용하면 안전하게 쓸 수 있음
  • fixed 는 unsafe 코드 내에서만 사용 가능
  • fixed 스코프를 나오면 메모리 고정은 종료
class Point
{
    public int x;
    public int y;
}

unsafe private static void ModifyFixedStorage()
{
    // 변수 pt는 GC에 의해 관리되는 메모리
    Point pt = new Point();

    // fixed 키워드를 이용해 관리되는 메모리에 포인터를 할당할 수 있음
    // 또한 GC에 의해 예기치 않은 메모리 재배치를 방지
    fixed (int* p = &pt.x)
    {
        *p = 1;
    }
}
  • C#에서는 namespace에서 메서드를 선언 및 정의할 수 없다

출처

Categories: ,

Updated: