大家下午好
如果你愿意,可以提供一点帮助。为了规避 .NET 中的 2Gb 对象限制,我制作了一个在堆上分配内存的类,这允许我创建不超过可用 RAM 限制的数组。然而,为了便于开发(因为它是一个概念证明),它被硬编码了很长时间。现在它可以工作了,我一直在尝试更改代码以使用泛型,这样我就可以对多种类型使用相同的代码。
在分配内存和正确索引数组时,我需要一个与数组将保存的类型相同的指针数组,即长数组需要 long*[] myLargeArray
。问题是当我使用泛型时,这个声明变成了 T*[] myLargeArray
,它总是产生错误 'Cannot take the address of, get the size of, or declare a pointer到托管类型 ('T')'
提前致谢。
PS 在任何人问之前,是的,我确实需要这么大的阵列。
二维数组的代码示例:
LargeArray <int> myArray = new LargeArray<int>(x, y);
public unsafe class LargeArray where T : struct
{
...
private T*[] tArr;
...
public LargeArray(long sizeI, long sizeJ)
{
...
myLargeArray = new T*[sizeI];
...
}
}
最佳答案
Any of the following types may be a pointer type:
- sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, or bool
- Any enum type.
- Any pointer type.
- Any user-defined struct type that contains fields of unmanaged types only.
当您将 struct
约束放在您的泛型类型上时,编译器没有足够的信息来推断上述所有要求都将得到满足(特别是最后一点)。
由于我们在 C# 中没有模板,您可能需要考虑为有意义的数字类型创建数组/指针适配器的重载,或者创建一个工厂类来创建给定的 LargeArray
某种类型的尺寸。
关于C#:使用泛型创建指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1631754/