如何通过结构从c++到c#最低延迟?(没有编组?)

本文关键字:延迟 结构 何通过 c++ | 更新日期: 2023-09-27 18:19:12

目前从c++传递到c#的struct是在两边声明(c++和c#)并使用委托。这里描述了这种方法。在我看来,对于低延迟的应用程序,它可能不适合,因为封送/解封送会消耗CPU/内存,并且当结构大小足够大,请求频率足够高并且延迟要求足够高时可能会影响性能。

对于这种低延迟的场景,最好不要分配额外的内存,而是直接在c#中使用c++内存。我发现一个项目使用System.IO.UnmanagedMemoryStreamSystem.IO.BinaryReader,然后某些字段可以读取,例如这样:

reader = new System.IO.BinaryReader(stream);
stream.Position = 8;
return reader.ReadInt32();

然而,我找不到完整的例子(如何在c#中有UnmanagedMemoryStream指向c++中的一些结构或结构数组?)我不确定这是最好的方法,但可能是这样。对于结构从c++到c#的"低延迟"迁移,你有什么建议?你能举个例子吗?

我不关心可移植性、可维护性等等。只有延迟是重要的。这是临时解决方案,直到我摆脱c#。

如何通过结构从c++到c#最低延迟?(没有编组?)

导入你的c++函数,并让它返回一个结构体作为参数。在c#中,使用IntPtr类型,并使用

DllImport("somedll.dll")
public static extern void SomeFunction(out IntPtr someStructParameterOutput);

然后:

IntPtr yourStruct;
SomeFunction(out yourStruct);
Stream s = new UnmanagedMemoryStream((byte*)yourStruct.ToPointer(), length);