방법: System::String의 문자에 액세스
문자열을 String 사용하는 wchar_t*
관리되지 않는 함수에 대한 고성능 호출을 위해 개체의 문자에 액세스할 수 있습니다. 메서드는 개체의 첫 번째 문자에 대한 내부 포인터를 생성합니다 String . 이 포인터는 직접 조작하거나 고정하고 일반 wchar_t
문자열을 예상하는 함수에 전달할 수 있습니다.
예제
PtrToStringChars
Char는 내부 포인터(라고도 함)를 byref
반환합니다. 따라서 가비지 수집이 적용됩니다. 네이티브 함수에 전달하지 않는 한 이 포인터를 고정할 필요가 없습니다.
다음과 같은 코드를 생각해 볼 수 있습니다. 내부 포인터이므로 고정이 필요하지 ppchar
않으며 가비지 수집기가 가리키는 문자열을 이동하면 업데이트 ppchar
됩니다. pin_ptr(C++/CLI)가 없으면 코드가 작동하며 고정으로 인한 잠재적인 성능 저하가 발생하지 않습니다.
네이티브 함수에 전달하는 ppchar
경우 고정 포인터여야 합니다. 가비지 수집기는 관리되지 않는 스택 프레임에서 포인터를 업데이트할 수 없습니다.
// PtrToStringChars.cpp
// compile with: /clr
#include<vcclr.h>
using namespace System;
int main() {
String ^ mystring = "abcdefg";
interior_ptr<const Char> ppchar = PtrToStringChars( mystring );
for ( ; *ppchar != L'\0'; ++ppchar )
Console::Write(*ppchar);
}
abcdefg
이 예제에서는 고정이 필요한 위치를 보여줍니다.
// PtrToStringChars_2.cpp
// compile with: /clr
#include <string.h>
#include <vcclr.h>
// using namespace System;
size_t getlen(System::String ^ s) {
// Since this is an outside string, we want to be secure.
// To be secure, we need a maximum size.
size_t maxsize = 256;
// make sure it doesn't move during the unmanaged call
pin_ptr<const wchar_t> pinchars = PtrToStringChars(s);
return wcsnlen(pinchars, maxsize);
};
int main() {
System::Console::WriteLine(getlen("testing"));
}
7
내부 포인터에는 네이티브 C++ 포인터의 모든 속성이 있습니다. 예를 들어 연결된 데이터 구조를 탐색하고 포인터를 하나만 사용하여 삽입 및 삭제를 수행하는 데 사용할 수 있습니다.
// PtrToStringChars_3.cpp
// compile with: /clr /LD
using namespace System;
ref struct ListNode {
Int32 elem;
ListNode ^ Next;
};
void deleteNode( ListNode ^ list, Int32 e ) {
interior_ptr<ListNode ^> ptrToNext = &list;
while (*ptrToNext != nullptr) {
if ( (*ptrToNext) -> elem == e )
*ptrToNext = (*ptrToNext) -> Next; // delete node
else
ptrToNext = &(*ptrToNext) -> Next; // move to next node
}
}