operator[]似乎多余,因为operator double*似乎足够了。
这是我的代码:
struct CStandardData
{
inline operator double* () { return m_standardData; }
//inline double& operator [] (size_t ix) { return m_standardData[ix]; }
size_t m_standardDataRefCnt{ 0 };
double m_standardData[1];
} sd;
Run Code Online (Sandbox Code Playgroud)
我用sd各种不同的情况包括double *a = sd,sd[x] = 5.0,sd[x] >= sd[y]等,无论我是否有足够的operator []注释或定义,代码似乎正常工作。
在什么情况下有必要operator []?
我可能应该添加一些上下文:
我在double sd[]大于5000行的大型代码库中使用了动态分配的内部数据。然后,由于需要复制它所在的对象,并且需要将副本传递给用户(double sd[]> 10000个元素,因此我不想制作额外的副本),因此需要向此double数组添加分配引用计数。这是我设计的方案,无需修改使用它的大量代码,但是不确定是否省略operator []会导致任何问题。
当我将 DLL 构建选项从本机更改为 /CLR 以便我可以跨 c#/c++ 边界进行调试时,我的性能下降了一半。
我开发了一个具有特定高性能算法的本机 C++ DLL 来解决我的计算问题。我需要将该 DLL 插入到业务合作伙伴开发的 C# 应用程序中,并用它来替换他们性能较低的算法。一切都很顺利,我使用静态包装器调用插入了 DLL,DLL 算法运行良好,显示出比原始算法性能提高了 2 倍,但无法跨边界调试。然后,我将 c++ DLL 构建设置从本机切换到 /CLR,以便能够跨 c#/c++ DLL 边界进行调试,但我的性能下降了一半。
无法弄清楚为什么会这样。
C++ DLL 端:
extern "C"
{
__declspec(dllexport) void* NewCalc()
{
return (void*)new CalcCL;
}
__declspec(dllexport) double Calc(void* sCalc, int *Buf, int Cnt)
{
return ((CalcCl*)sCalc)->Calc(Buf, Cnt);
}
}
Run Code Online (Sandbox Code Playgroud)
c# 端:
[DllImport("CalcDLL.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int NewCalc();
[DllImport("CalcDLL.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern double Calc(int sCalc, int[] Buf, int Cnt); …Run Code Online (Sandbox Code Playgroud)