代码之家  ›  专栏  ›  技术社区  ›  Soleil

封送结构列表时出现意外结果

  •  0
  • Soleil  · 技术社区  · 7 年前

    我不知道我做错了什么。我想我做的每件事都是按部就班的,但看起来我好像漏掉了什么。

    public override List<TimerPair> GetNativeTimers()
    {
        var listPtr = HgrDll.GetNativeTimers(out var size, out var ptrShift);
    
        if (listPtr == IntPtr.Zero)
            throw new NullReferenceException("sounds like the list"
                 + " pointer was not given");
    
        var timerPairList = new List<TimerPair>(size);
        var structSize = Marshal.SizeOf(typeof(TimerPairStruct2));
    
        for (var i = 0; i < size; i++)
        {
            var o = Marshal.PtrToStructure<TimerPairStruct2>(listPtr).ToTimerPair();
            timerPairList.Add(o);
            listPtr += structSize;
        }
        return timerPairList;
    }
    

    目标结构(用于中间计算)和类:

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    internal struct TimerPairStruct2 : ITimerPairStruct
    {
        public long Time;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=64)]
        public string Descr;
    
        public TimerPair ToTimerPair() => new TimerPair(Descr, Time);
    }
    
    public class TimerPair
    {
        public string Descr { get; set; }
        public TimeSpan Time { get; set; }
        public TimerPair(string descr, long time)
        {
            Descr = descr;
            Time = new TimeSpan(0,0,0,0, (int)((double)time/1000000));
        }
    }
    

    对于Pinvoke部分:

    [DllImport("DwarfHomograph.dll", CallingConvention = CallingConvention.Cdecl)]
    internal static extern IntPtr GetNativeTimers(out int size, out int ptrShift);
    

    DwarfHgr* DwarfAsset = nullptr;
    
    extern "C" __declspec(dllexport) list<TimerPair>* GetNativeTimers(
        int* size,
        int* ptrShift)
    {
        return DwarfAsset->GetNativeTimers(size, ptrShift);
    }
    

    使用的方法来自 DwarfHgr

    list<TimerPair>* DwarfHgr::GetNativeTimers(int* size, int* ptrShift)
    {
        TimerPairsList = Sw.AsTimerPairs();
        *size = static_cast<int>(TimerPairsList.size());
        *ptrShift = sizeof(TimerPair);
        return &TimerPairsList;
    }
    

    成员是 list<TimerPair> TimerPairsList;

    //#pragma pack(push,8)
    struct __declspec(dllexport) TimerPair final
    {
        long long Time{}; // ns
        char Descr[64]{};
    };
    //#pragma pack(pop)
    

    我在本机和托管两个方面都进行了单元测试 预期结果 看起来像(本地的):

    ImageA processing: 22.0704ms
    ImageB processing: 22.0448ms
    MatFullA.copyTo: 1.87452ms
    MatToSparse: 1.93482ms
    calcOpticalFlowFarneback: 1115.48ms
    create flowSparse image: 10.1416ms
    

    但我有这个(管理):

    °óŠqÉ: 1,964,675.000000ms
    q$Fý: 140,725,780.000000ms
    xr$Fý: 140,725,780.000000ms
    : 549,755.000000ms
    à¡CUÉ: 1,964,675.000000ms
    : 0.000000ms
    
    0 回复  |  直到 7 年前