Arrays 如何在C+中将无符号字符*传递给托管方法+/CLI是否有效?
考虑以下托管类:Arrays 如何在C+中将无符号字符*传递给托管方法+/CLI是否有效?,arrays,.net,c++-cli,Arrays,.net,C++ Cli,考虑以下托管类: public ref class DataProvider { public: static int ReadData(void* handlePtr, unsigned char* buffer, int cnt) { if (handlePtr == nullptr) { return -1; } GCHandle handle = GCHandle::FromIntPtr(IntPtr
public ref class DataProvider
{
public:
static int ReadData(void* handlePtr, unsigned char* buffer, int cnt)
{
if (handlePtr == nullptr)
{
return -1;
}
GCHandle handle = GCHandle::FromIntPtr(IntPtr::IntPtr(handlePtr));
System::IO::Stream^ _stream = dynamic_cast<System::IO::Stream^>(handle.Target);
if (_stream == nullptr)
{
return -1;
}
array<unsigned char>^ data = gcnew array<unsigned char>(cnt);
pin_ptr<unsigned char> dataPtr = &data[0];
int read = stream->Read(data, 0, cnt);
if (read > 0)
{
memcpy(buffer, dataPtr, cnt);
}
return read;
}
}
公共引用类数据提供程序
{
公众:
静态int ReadData(void*handlePtr,unsigned char*buffer,int cnt)
{
if(handlePtr==nullptr)
{
返回-1;
}
GCHandle handle=GCHandle::fromtptr(IntPtr::IntPtr(handlePtr));
System::IO::Stream^\u Stream=dynamic\u cast(handle.Target);
if(_stream==nullptr)
{
返回-1;
}
数组^data=gcnew数组(cnt);
pin_ptr dataPtr=&data[0];
int read=stream->read(数据,0,cnt);
如果(读取>0)
{
memcpy(缓冲区、数据ptr、cnt);
}
返回读取;
}
}
ReadData
方法通过非托管代码的回调调用。它工作,但分配临时数据
缓冲区。看起来太过分了
问题:是否可以将原始的
缓冲区
传递到流->读取
方法中,并消除此额外数据
缓冲区的分配?@HansPassant非常感谢您的评论。我将检查性能计数器,但此方法是核心组件,执行速度非常高。我需要确保不可能将已分配的缓冲区传递到托管方法以减少内存流量。@HansPassant非常感谢您的评论。我将检查性能计数器,但此方法是核心组件,执行速度非常高。我需要确保不可能将已分配的缓冲区传递到托管方法以减少内存流量。