繁体   English   中英

在C#中修复数组的数组(不安全代码)

[英]Fixing an array of array in C# (unsafe code)

我正在尝试提出一种解决方案,该解决方案是如何将数组的数组从C#传递到本机函数中。 我已经有一个函数(Marshal.GetDelegateForFunctionPointer)的委托,但是现在我正在尝试将多维数组(或更确切地说,数组的数组)传递给它。

当输入具有2个子数组时,此代码示例有效,但我需要能够处理任意数量的子数组。 您想到的最简单的方法是什么? 我不希望在数组之间复制数据,因为这将在实时循环中发生(我正在与音频效果进行通信)

public void process(float[][] input)
{
    unsafe
    {
        // If I know how many sub-arrays I have I can just fix them like this... but I need to handle n-many arrays
        fixed (float* inp0 = input[0], inp1 = input[1] )
        {
            // Create the pointer array and put the pointers to input[0] and input[1] into it
            float*[] inputArray = new float*[2];
            inputArray[0] = inp0;
            inputArray[1] = inp1;
            fixed(float** inputPtr = inputArray)
            {
                // C function signature is someFuction(float** input, int numberOfChannels, int length)
                functionDelegate(inputPtr, 2, input[0].length);
            }
        }
    }
}

您可以将对象fixed在适当的位置,而无需使用fixed ,而GCHandle获取固定到相关对象的GCHandle 当然,不言而喻, 这样做是您有责任确保指针不会在未固定对象的点上幸存 我们称其为“不安全”代码是有原因的。 您必须负责安全的内存管理,而不是运行时。

http://msdn.microsoft.com/zh-CN/library/system.runtime.interopservices.gchandle.aspx

试图将引用数组锁定到托管数组没有任何意义。

其中的引用值可能不指向第一个元素的地址,即使引用了,也将是实现细节。 发行版之间可能会有所不同。

复制指向大量数据的指针数组不应该那么慢,尤其是与您要调用的多媒体处理相比时。

如果很重要,请在托管堆之外分配数据,则不会进行固定或复制。 但是更多的簿记。

我知道的最简单的方法是使用一维数组。 它降低了复杂性,减少了内存碎片,并且还将具有更好的性能。 我实际上是在我的项目中这样做的。 您可以使用手动索引,例如array[i][j] = oneDimArray[i *n + j]然后将n作为参数传递给函数。 就像在示例中所做的那样,您将只进行一种修复:

public void process(float[] oneDimInput, int numberOfColumns)
{
    unsafe
    {
        fixed (float* inputPtr = &oneDimInput[0])
        {
                // C function signature is someFuction(
                // float* input, 
                // int number of columns in oneDimInput
                // int numberOfChannels, 
                // int length)
                functionDelegate(inputPtr, numberOfColumns, 2, oneDimInput[0].length);
        }
    }
}

我还要指出的是,二维数组很少在高性能计算库中使用,例如Intel MKL,Intel IPP等。 甚至BLAS和Lapack接口也仅包含一维数组,并使用我提到的方法(由于性能原因)模拟了二维。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM