【问题标题】:Jagged array pinning in c#c#中的锯齿状数组固定
【发布时间】:2014-01-23 16:22:29
【问题描述】:

我有一个问题。我正在尝试固定一个锯齿状数组(由于我正在处理的数据的绝对大小,我正在使用它):

    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();
    }

我需要在我的代码的多个部分中使用这些 double**,并且我真的不想在每次需要使用它们时都明确地固定它们。在我看来,因为我可以通过通常的固定语句来修复它们,所以我应该能够为它们分配一个固定句柄。

有什么方法可以真正固定一个 double*[] 吗?

【问题讨论】:

  • 如果您有这么多数据,并且发现自己不断地固定和取消固定它,也许最好将整个数据移到非托管代码中。或者,如果您不更改子数组的长度,请将它们一起运行并分别记住长度/偏移量。无论如何,你不会得到任何边界检查不安全的代码。
  • 这就是我到目前为止所做的事情,但我受到限制,因为我仍在使用 .NET 4,因此无法使用海量数组(技术上限制为每个数组 2GB)。我也尝试过内存分页文件和非固定数组,但这在性能方面是令人望而却步的。
  • 我的意思是真正的非托管代码——C/C++ 中的外部 dll 或其他。如果您的数据不适合 2GB 地址空间,则需要 64 位平台,这就是它的用途。
  • 我指的是stackoverflow.com/a/11202075/3164871 根据未编码的代码解决方案,我在处理我的数组时使用了相当多的近交 c# 数学例程,这意味着我必须要么使用一个非常棘手的基于委托的编组,或将大部分代码移植到 C/C++。我肯定会超出 32 位地址空间的限制,因为我的内部数组的 每个 都包含数百万个双精度数
  • 是的,我知道托管数组和对象大小限制。只需将您的计算移植到 C/C++。我认为这将比任何其他选择容易得多。 System.Math 中的例程(这就是您所说的“近亲繁殖”吗?)是标准的东西,&lt;math.h&gt;&lt;math&gt; 中有等效的例程。

标签: c# pointers unsafe jagged-arrays


【解决方案1】:

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

【讨论】:

  • 你能分享更多关于这个的细节吗,我经历过这样的场景..,最终使用了链接列表集合..,我想知道你在这方面的方法
猜你喜欢
  • 2011-05-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 2013-12-27
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
相关资源
最近更新 更多