下午所有,
如果你愿意,请帮忙。为了规避.NET中的2Gb对象限制,我创建了一个在堆上分配内存的类,这允许我创建最大可达RAM空间的数组。但是,为了便于开发(因为它是一个概念证明),它很难编写。既然它有效,我一直在尝试改变代码以使用泛型,所以我可以为多种类型使用相同的代码。在分配内存并正确索引数组时,我需要一个与数组相同类型的指针数组,即一个长数组需要long*[] myLargeArray
。问题是,当我使用泛型时,此声明变为T*[] myLargeArray
,它总是产生错误 '不能获取地址,获取大小,或声明指向托管类型的指针('T ')'
提前致谢。
PS在任何人问之前,是的,我确实需要这么大的阵列。
2D数组的代码示例:
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];
...
}
}
答案 0 :(得分:12)
以下任何类型都可能是a 指针类型:
- sbyte,byte,short,ushort,int,uint,long,ulong,char,float, double,decimal或bool
- 任何枚举类型。
- 任何指针类型。
- 包含非托管类型字段的任何用户定义的结构类型 仅
当您对通用类型放置struct
约束时,编译器没有足够的信息来推断将满足所有上述要求(特别是最后一点)。
由于我们在C#中没有模板,您可能需要考虑为有意义的数值类型创建数组/指针适配器的重载,或者考虑为给定大小为LargeArray
的工厂类创建{{1}}某种类型。
答案 1 :(得分:0)
来自MSDN
即使与不安全一起使用 关键字,取一个地址 托管对象,获得一个大小 托管对象,或声明指针 不允许使用托管类型。对于 更多信息,请参阅Unsafe Code and Pointers (C# Programming Guide).
此外,我不知道您是否,但请确保您在代码中使用fixed keyword。