수색…


비고

  • .Net 프로젝트에서 unsafe 키워드를 사용할 수 있으려면 프로젝트 속성 => 빌드에서 "안전하지 않은 코드 허용"을 선택해야합니다
  • 안전하지 않은 코드를 사용하면 성능을 향상시킬 수 있지만 코드 안전성을 희생합니다 (따라서 unsafe 용어).

예를 들어 for 루프를 사용하면 다음과 같은 배열이됩니다.

for (int i = 0; i < array.Length; i++)
{
    array[i] = 0;
}

.NET Framework는 배열의 경계를 초과하지 않도록하여 인덱스가 경계를 초과하는 경우 IndexOutOfRangeException 던집니다.

그러나 안전하지 않은 코드를 사용하면 다음과 같이 배열의 범위를 초과 할 수 있습니다.

unsafe
{
    fixed (int* ptr = array)
    {
        for (int i = 0; i <= array.Length; i++)
        {
            *(ptr+i) = 0;
        }
    }
}

안전하지 않은 배열 인덱스

void Main()
{
    unsafe
    {
        int[] a = {1, 2, 3};
        fixed(int* b = a)
        {
            Console.WriteLine(b[4]);
        }
    }
}

이 코드를 실행하면 길이가 3 인 배열이 만들어 지지만 다섯 번째 항목 (인덱스 4)을 얻으려고합니다. 내 컴퓨터에서는 1910457872 인쇄되었지만 동작은 정의되지 않았습니다.

unsafe 블록이 없으면 포인터를 사용할 수 없으므로 예외가 throw되지 않고 배열의 끝을지나 값에 액세스 할 수 없습니다.

안전하지 않은 배열 사용

포인터로 배열에 액세스 할 때 경계 검사가 없으므로 IndexOutOfRangeException 이 발생하지 않습니다. 이것은 코드를 더 빠르게 만듭니다.

포인터를 사용하여 배열에 값 지정 :

class Program
{
    static void Main(string[] args)
    {
        unsafe
        {
            int[] array = new int[1000]; 
            fixed (int* ptr = array)
            {
                for (int i = 0; i < array.Length; i++)
                {
                    *(ptr+i) = i; //assigning the value with the pointer
                }
            }
        }
    }
}

안전하고 정상적인 상대는 다음과 같습니다 :

class Program
{
    static void Main(string[] args)
    {            
        int[] array = new int[1000]; 

        for (int i = 0; i < array.Length; i++)
        {
            array[i] = i;
        }
    }
}

안전하지 않은 부분은 일반적으로 빠르며 성능의 차이는 어레이의 요소의 복잡성과 각 요소에 적용된 논리에 따라 달라질 수 있습니다. 비록 더 빨라질지라도, 유지하기가 더 어려워지기 쉬우므로 조심해서 사용해야합니다.

안전하지 않은 문자열 사용

var s = "Hello";      // The string referenced by variable 's' is normally immutable, but
                      // since it is memory, we could change it if we can access it in an 
                      // unsafe way.

unsafe                // allows writing to memory; methods on System.String don't allow this
{
  fixed (char* c = s) // get pointer to string originally stored in read only memory
    for (int i = 0; i < s.Length; i++)
      c[i] = 'a';     // change data in memory allocated for original string "Hello"
}
Console.WriteLine(s); // The variable 's' still refers to the same System.String
                      // value in memory, but the contents at that location were 
                      // changed by the unsafe write above.
                      // Displays: "aaaaa"


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow