как мы можем избежать выделения, сделанного Marshal :: StringToHGlobalAnsi? - PullRequest
1 голос
/ 03 июня 2010

Моя оболочка от управляемой до неуправляемой обрабатывает много данных, и эта функция Marshal :: StringToHGlobalAnsi будет вызывать новую для каждой из них, что для меня является большим хитом. Итак, мой вопрос:

Можно ли выделить часть неуправляемой памяти и использовать ее для преобразования управляемых типов данных в неуправляемые вручную?

Ответы [ 2 ]

2 голосов
/ 03 июня 2010

Предполагая, что все символы в System::String находятся в диапазоне ASCII, самая базовая реализация будет выглядеть примерно так:

void ConvertAndCopy(System::String^ ms, char* us)
{
    for (int i(0); i < ms->Length; ++i)
        us[i] = static_cast<char>(ms[i]);

    us[ms->Length] = '\0';
}

// usage example:
System::String^ ms = "Hello world";
char us[12] = "";

ConvertAndCopy(ms, us);

Обратите внимание, что при этом не выполняется проверка границ массива назначения и не выполняется преобразование набора символов.

Работает ли это лучше, чем StringToHGlobalAnsi или стоит ли какой-либо прирост производительности значительного увеличения сложности (а именно, управления собственной памятью и обработки преобразований наборов символов), я не знаю.

0 голосов
/ 03 июня 2010

Дайте этому шанс.

char *poutputString = (char *)(void *)Marshal::StringToHGlobalAnsi(inputString);
// do something with poutputString here
Marshal::FreeHGlobal(poutputString);

Это единственный способ, которым я видел это. Можете ли вы предоставить фрагмент кода того, как он используется в вашем случае?

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