C# Unsafe

C# 에서는 일반적으로 포인터를 사용하지 않지만, 간혹 C++ 에서 사용하던 Class를 가져오면서 포인터를 사용해야 하는 경우가 발생한다. 포인터를 사용하면 CLR에서 안전성을 책임지지 못하고, 불완전한 코드가 된다고 하며 에러를 발생하는데, 이렇게 예전 코드를 사용해야 할 경우, 빌드 속성을 변경해줌으로써 unsafe 코드를 사용 할 수 있다.
1. 사용 방법
형식 또는 멤버 선언에서 unsafe 한정자를 사용할 수 있으며, 이렇게 선언해줄 경우 안전하지 않은 컨텍스트로 간주됩니다.

unsafe private uint reload()
{
uint s0 = 0, s1 = 0; int j = 0;
fixed (uint* p0 = &mt_state[0])
{ uint* pS = p0; uint* p1 = p0;
... 중략 ...
s1 = mt_state[0];
s1 ^= (s1 >> 11);
s1 ^= (s1 << 7) & 0x9D2C5680; 
s1 ^= (s1 << 15) & 0xEFC60000; 
} 
return (s1 ^ (s1 >> 18));
}

2. fixed 키워드
fixed 지시어는 unsafe 컨텍스트에서만 허용 됩니다.

클래스가 인스턴스화 되면 CLR에 의해 언제든지 메모리가 이동 될 수 있는데, fixed 지시어를 이용하면 해당 코드에 들어간 변수 및 객체는 가비지 콜렉팅이 발생할 때 주소 재배치 대상이 아니게 됩니다.

“C# Unsafe”의 122개의 댓글

  1. I’d need to verify with you here. Which is not one thing I often do! I enjoy reading a submit that can make individuals think. Additionally, thanks for allowing me to comment!

  2. Hi, i believe that i noticed you visited my blog thus i got here to “go back the prefer”.I am attempting to to find things to improve my web site!I assume its adequate to make use of a few of your ideas!!

  3. En iyi leke kremi alarak cildinizdeki cilt tonu farklılıklarına son verebililrsiniz, Dünya çapında satışa sunulan hc care leke kremine sahip olmak
    sadece bir tık uzakta.. Yaz gelmeden cilt tonu farklılıklarına en iyi
    leke kremi markası ile son verebilirsin!
    Leke kremi ; LEKE KreMi

  4. Its like you read my mind! You appear to know so much about this, like you wrote the book in it or something. I think that you could do with a few pics to drive the message home a little bit, but instead of that, this is excellent blog. A fantastic read. I will certainly be back.

답글 남기기