我们怎样才能避免Marshal :: StringToHGlobalAnsi完成分配?

时间:2010-06-02 23:02:45

标签: .net c++ visual-c++ interop

我从托管到非托管的包装器处理大量数据,这个函数Marshal :: StringToHGlobalAnsi会为每个人调用new,这对我来说是一个很大的打击。所以我的问题是:

我是否可以分配一大块非托管内存并使用它将托管数据类型转换为非托管内存?

2 个答案:

答案 0 :(得分:2)

假设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或者是否有任何性能提升值得复杂性的显着增加(即管理自己的内存和处理字符集转换),我不知道。

答案 1 :(得分:-1)

给这一点。

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

这是我见过它的唯一方法。你能提供一个代码片段,说明它在你的情况下使用的方式吗?