C# c中的锯齿阵列钉扎#

C# c中的锯齿阵列钉扎#,c#,pointers,unsafe,jagged-arrays,C#,Pointers,Unsafe,Jagged Arrays,我有点问题。我正在尝试固定一个锯齿状数组(由于我正在处理的数据非常大,所以我正在使用该数组): public void示例代码(双[][]变量){ int nbObservants=变量。长度; var allHandles=new List(); double*[]observationsPointersTable=新的double*[nbObservants]; 双**指针; GCHandle; 对于(int i=0;i

我有点问题。我正在尝试固定一个锯齿状数组(由于我正在处理的数据非常大,所以我正在使用该数组):

public void示例代码(双[][]变量){
int nbObservants=变量。长度;
var allHandles=new List();
double*[]observationsPointersTable=新的double*[nbObservants];
双**指针;
GCHandle;
对于(int i=0;i
我需要在我的代码的多个部分中使用这些double**,并且我不想每次需要使用它们时都显式地固定它们。在我看来,因为我可以通过通常的fixed语句来修复它们,所以我应该能够为它们分配一个固定句柄


是否有任何方法可以实际固定双精度*[]?

显然没有方法可以做到这一点。因此,我决定使用固定语句,而不是分配固定句柄。

如果您有这么多数据,并且发现自己一直在固定和取消固定,那么最好将整个过程转移到非托管代码中。或者,如果不更改子阵列的长度,请将它们一起运行,并分别记住长度/偏移。无论如何,在不安全代码中都不会得到任何边界检查。这是我到目前为止一直在做的事情,但我受到限制,因为我仍然使用.NET 4,因此无法使用大规模阵列(从技术上讲,每个阵列的容量限制为2GB)。我也尝试过内存分页文件和非固定数组,但这是禁止的,性能方面的。我指的是真正的非托管代码-C/C++或其他任何语言中的外部dll。如果您的数据不适合2GB地址空间,则需要64位平台,这就是它的用途。我指的是根据未匹配代码解决方案,我在处理数组时使用了大量自交c#math例程,这意味着我必须使用非常复杂的基于委托的封送,或者将大部分代码移植到c/c++。我肯定会超越32位地址空间的限制,因为我的每个内部阵列都包含数百万个doublesYeah,我知道托管阵列和对象大小的限制。只需将计算移植到C/C++。我认为这将比任何其他选择容易得多。
System.Math
(这就是你所说的“近亲繁殖”吗?)中的例程是标准的,在
中有等价的例程。你能分享更多关于这方面的细节吗,我经历过这样的场景….最终使用了链表集合….,我想知道你在这方面的方法
    public void ExampleCode(double[][] variables) {
        int nbObservants = variables.Length;

        var allHandles = new List<GCHandle>();
        double*[] observationsPointersTable = new double*[nbObservants];
        double** observationsPointer;
        GCHandle handle;

        for (int i = 0; i < nbObservants; i++) {
            handle = GCHandle.Alloc(variables[i], GCHandleType.Pinned);
            allHandles.Add(handle);
            observationsPointersTable[i] = (double*) handle.AddrOfPinnedObject(); // no prob here
        }

        fixed(double** obsPtr = observationsPointersTable) { // works just fine
            Console.WriteLine("haha {0}", obsPtr[0][0]);
        }

        handle = GCHandle.Alloc(observationsPointersTable, GCHandleType.Pinned); // won't work
        allHandles.Add(handle);
        observationsPointer = (double**) handle.AddrOfPinnedObject();

        // ...

        foreach (var aHandle in allHandles) {
            aHandle.Free();
        }
        allHandles.Clear();
    }