从托管C++;到C# 我在一个托管C++ DLL中有一个函数,它需要把128位返回到C。我在C语言中发现了一个主题,叫做非托管C++,但对托管调用的管理却没有太多的了解。

从托管C++;到C# 我在一个托管C++ DLL中有一个函数,它需要把128位返回到C。我在C语言中发现了一个主题,叫做非托管C++,但对托管调用的管理却没有太多的了解。,c#,managed-c++,C#,Managed C++,此调用将在一个紧密的循环中发生,可能在服务器场中每天发生数十亿次 什么是传回比特的最有效方法 到目前为止,我考虑使用GUID结构作为bits的方便容器,但我不清楚.NET运行时是否会对该结构进行GC,我也不确定这是否是最有效的机制。简单地说,传递C++/CLI中定义的以下类型的变量: public value struct Int128 { System::Int64 lo; System::Int64 hi; }; 应该是最快的。简单地说,传递C++/CLI中定义的以下类型的

此调用将在一个紧密的循环中发生,可能在服务器场中每天发生数十亿次

什么是传回比特的最有效方法


到目前为止,我考虑使用GUID结构作为bits的方便容器,但我不清楚.NET运行时是否会对该结构进行GC,我也不确定这是否是最有效的机制。

简单地说,传递C++/CLI中定义的以下类型的变量:

public value struct Int128
{
    System::Int64 lo;
    System::Int64 hi;
};

应该是最快的。简单地说,传递C++/CLI中定义的以下类型的变量:

public value struct Int128
{
    System::Int64 lo;
    System::Int64 hi;
};

应该是你能做的最快的。

每天“数十亿次”并不是一个紧密的循环。每分钟数十亿次可能值得花时间进行优化,每秒数十亿次将是相当不错的吞吐量,但每天听上去不太值得担心。无论如何,如果绩效很重要,一定要衡量,衡量,衡量。不要只相信这里或其他地方的人的建议。测量每一个候选实现,并选择最好的实现。发送一个简单的位数组或四个整数数组难道不可能吗?我确信GCIf将在64位上正确维护托管到托管的传输,只需使用2个
Int64
参数。每天“数十亿次”并不是一个严格的循环。每分钟数十亿次可能值得花时间进行优化,每秒数十亿次将是相当不错的吞吐量,但每天听上去不太值得担心。无论如何,如果绩效很重要,一定要衡量,衡量,衡量。不要只相信这里或其他地方的人的建议。测量每一个候选实现,并选择最好的实现。发送一个简单的位数组或四个整数数组难道不可能吗?我确信GCIf将在64位上正确维护托管到托管传输,只需使用2个
Int64
参数。如何将此结构返回到C#?我在C++中得到编译错误:<代码> Eric J. .DEXSPEC(DLLISTUM)不能应用到一个函数,其中使用了y~(CyrCuleCalk调用约定< /CODE> >):您不在做管理C++。如果您正在编写一个DLL,您的DLL导出了函数,则必须执行“非托管”C++。这是编译器告诉你的。我对VC++(一个普通的C++)并不熟悉。我正在使用
/clr
进行编译。我还需要做什么才能在C++中创建一个托管DLL?@ Eric J.:或者。基本上,你可以用C++编写.NET代码,与C语言中的代码方式差不多,但是你可以访问普通C++代码。要使用这个类,您必须编写类似于
public ref struct Utils{static void UseInt128(Int128 i){…}如何将此结构返回到C#?我在C++中得到编译错误:<代码> Eric J. .DEXSPEC(DLLISTUM)不能应用到一个函数,其中使用了y~(CyrCuleCalk调用约定< /CODE> >):您不在做管理C++。如果您正在编写一个DLL,您的DLL导出了函数,则必须执行“非托管”C++。这是编译器告诉你的。我对VC++(一个普通的C++)并不熟悉。我正在使用
/clr
进行编译。我还需要做什么才能在C++中创建一个托管DLL?@ Eric J.:或者。基本上,你可以用C++编写.NET代码,与C语言中的代码方式差不多,但是你可以访问普通C++代码。要使用这个类,您必须编写类似于
public ref struct Utils{static void UseInt128(Int128 i){…}