【发布时间】: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中的例程(这就是您所说的“近亲繁殖”吗?)是标准的东西,<math.h>或<math>中有等效的例程。
标签: c# pointers unsafe jagged-arrays