더북(TheBook)

예제 13-21 stackalloc과 포인터를 이용해서 랜덤 문자열 생성 ▶ GenerateRandomString2.cs

unsafe static string Generate(string alphabet, Random random, int length)
{
    char* chars = stackalloc char[length];
    for (int i = 0; i < length; i++)
    {
        chars[i] = alphabet[random.Next(alphabet.Length)];
    }
    return new string(chars);
}

이제 문자열 생성 시에만 힙 할당을 수행한다. 임시 버퍼는 스택에 할당된다. 하지만 포인터를 사용했기 때문에 unsafe 한정자를 사용해야만 했다. 안전하지 않은 코드를 사용하면 설사 코드가 안전하게 수행될 것이라는 확신이 있다 하더라도 상당히 불편할 수밖에 없으며, 이처럼 포인터를 사용해서 코드를 복잡하게 작성하고 싶지도 않을 것이다. 그리고 스택에 할당한 임시 버퍼로부터 문자열을 생성하기 위한 복사 과정은 여전히 동일하게 수행되고 있다.

다행히 Span<T>를 사용하면 다음 예제와 같이 unsafe 한정자를 사용하지 않고도 stackalloc을 사용할 수 있다. 유사 참조 구조체의 제약 사항 덕분에 코드가 안전하게 유지될 수 있으므로 unsafe 한정자가 필요하지 않은 것이다.

예제 13-22 stackalloc과 Span<char>를 이용해서 랜덤 문자열 생성 ▶ GenerateRandomString3.cs

static string Generate(string alphabet, Random random, int length)
{
    Span<char> chars = stackalloc char[length];
    for (int i = 0; i < length; i++)
    {
        chars[i] = alphabet[random.Next(alphabet.Length)];
    }
    return new string(chars);
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.