Можно ли передать .Net String в fn (const char16_t * str) без копирования? - PullRequest
0 голосов
/ 30 января 2019

Я хочу использовать библиотечную функцию, которая принимает строку UTF16-LE в качестве параметра (const char16_t* str, size_t length).Параметр length необходимо указывать только для строк, которые не заканчиваются нулем.Функция скопирует строку и будет работать с ней.

. Строки .Net хранятся в памяти как UTF16 - предполагая, что они хранятся в кодировке с прямым порядком байтов, нужно иметь возможность закрепить строку, получить внутреннююнаведите указатель на эту функцию библиотеки и предоставьте ее без дополнительной копии, поскольку библиотека все равно ее скопирует.

Возможно ли это, и при каких обстоятельствах это будет стоить повышения производительности (закрепление объекта небесплатно, я полагаю)?

(Это внутренний цикл приложения, которое в основном копирует тонны строк из A в B, и эта копирующая часть является текущим узким местом, поэтому имеет смысл ускорить этовверх).

Редактировать Этот вопрос является почти дубликатом, поэтому я временно удалил его.Но это не совсем дубликат этого другого вопроса, который спрашивает о доступе к данным как const wchar_t*, тогда как мне нужно const char16_t*.

1 Ответ

0 голосов
/ 31 января 2019

Да, это можно сделать.

PtrToStringChars позволяет нам получить доступ к внутреннему const wchar_t* без копирования.Все, что нужно сейчас, это от reinterpret_cast до const char16_t*:

void useStringInCLib(System::String^ s)
{
  pin_ptr<const wchar_t> wch = PtrToStringChars(s);
  const char16_t *chars = reinterpret_cast<const char16_t*>(wch);
  long charLen = s->Length;
  // long byteLen = charLen + charLen; // 2 byte wide characters
  use_it(chars, charLen);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...