Скопировать строку в буфер памяти в C # - PullRequest
3 голосов
/ 19 ноября 2011

Каков наилучший способ скопировать строку в необработанный буфер памяти в C #?

Обратите внимание, что я уже знаю, как и когда использовать String и StringBuilder, так что не предлагайте этого;) код и более производительный, пока я могу получить данные в него. (Я имею в виду буферы редактора B-дерева и файлы с отображением в памяти, что плохо сопоставляется с управляемыми объектами C #, но легко кодируется с помощью указателей.)

Вещи, которые я уже рассмотрел:

  • C ++ / CLI может сделать то же самое, в vcclr.h есть PtrToStringChars, который затем может быть передан в memcpy, но я обычно предпочитаю иметь только одну сборку, а объединение IL из нескольких языков мне нравится избежать. Любой способ переписать эту функцию в C #?

  • System.Runtime.InteropServices.Marshal имеет функции, которые копируют строку, но только во вновь выделенный буфер. Не удалось найти функцию для копирования в существующий буфер.

  • Я мог бы использовать String.CopyTo и использовать массив вместо буфера памяти, но затем мне нужно много раз закрепить этот буфер (или сохранить его постоянно), что будет плохо для GC. (Используя буфер памяти в первую очередь, я могу выделить его вне управляемой кучи, чтобы он не мешал с GC.)

  • Если есть способ закрепить или скопировать StringBuilder, то это, вероятно, тоже сработает. Мой текст обычно приходит из файла или из StringBuilder, поэтому, если я уже могу переместить его в буфер памяти, ему никогда не нужно проходить через экземпляр String. (Обратите внимание, что переход от StringBuilder к String не имеет значения для производительности, поскольку он оптимизирован, чтобы не делать копию, если впоследствии вы перестанете использовать StringBuilder.)

  • Могу ли я генерировать IL, который прикрепляет String или StringBuilder? Тогда вместо написания функции копирования в C # я мог бы сгенерировать DynamicMethod, испустив требуемый IL. Только что подумал об этом, когда писал вопрос, поэтому я мог бы просто попытаться разобрать путь C ++ / CLI и воспроизвести IL.

1 Ответ

4 голосов
/ 19 ноября 2011

включить небезопасный код (где-то в настройках проекта), затем использовать:

unsafe
{
    fixed(char* pc = myString)
    {
    }
}

, а затем просто использовать копии памяти низкого уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...