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에서 메서드를 선언 및 정의할 수 없다
출처
- https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/unsafe
- https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/unsafe-code
- https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/fixed-statement
- https://stackoverflow.com/questions/10568254/methods-inside-namespace-c-sharp