2012-01-31 1 views
1

UTF8로 인코딩 된 미리 할당 된 관리되지 않는 버퍼에 C# 문자열을 작성해야합니다.UTF8 인코딩을 사용하여 미리 할당 된 관리되지 않는 버퍼에 C# 문자열 작성

  • 없음 새로운 할당 (그래서, 바이트 배열 또는 다른 인스턴스화를 만드는 관련된 답변을 저를 직접하지 마십시오)
  • : 응답하기 전에 다음 요구 사항를 참조하시기 바랍니다
  • 아니요 비 관리 코드로 변환 (핀 보크/캘러스 없음)

현재 OpCodes.Cpblk를 사용하여 C#의 원시 문자열을 16 비트 문자를 사용하여 관리되지 않는 버퍼로 복사하고 있습니다. 이것은 x64 아키텍처에서 관리되지 않는 memcpy를 사용하는 것과 거의 동일한 성능을 제공하며 실제로 처리량이 필요합니다.

나는 *는 문자 같은 문자열 고정 을 고려하고 그것을 반복하지만 성능에 관해서는 모두 성가신 최적보다 적은 것이다 점프 테이블없이 인코더를 구현하고있다.

+0

C++로 작성할 수없는 이유가 있습니까? – Gabe

+0

전환을 피하려면 C++을 사용하면 아무런 효과가 없습니다. –

+0

C++/CLR로 작성하면 전환이 없습니다. – Gabe

답변

6

는 안전하지 않은 과부하 UTF8Encoding 클래스의

public override unsafe int GetChars(byte* bytes, int byteCount, char* chars, int charCount) 

를 사용합니다. 문자열에 대한 포인터와 문자를받을 바이트 버퍼를 지정해야합니다. UTF-8 문자를 복사합니다. 할당은 일어나지 않지만 안전하지 않은 코드가 필요합니다.

+4

저는 왜 사람들이 그렇게하라고 설명하지 않고 무언가를 왜곡시키지 않습니다. 짧은 한 문장의 주석조차도 매우 유용 할 수 있습니다. –

+0

나는 이것이 왜 downvoted인지 이해하지 못한다. 문자열에 대한 포인터와 문자를받을 바이트 버퍼를 지정해야합니다. UTF-8 문자를 복사합니다. – usr

+0

어쩌면 간결한 것일 수도 있습니다. 내가 이제 답을 찾지 못했을 때, downvote는 쓸데없는 것이므로 되돌려 야합니다. – usr