C#:使用泛型创建指针数组

12
下午好,
如果您能帮忙就更好了。为了规避.NET中的2GB对象限制,我创建了一个在堆上分配内存的类,这使我可以创建数组,直到我的空闲RAM达到极限。但是,为了开发方便(因为它是一个概念验证),它被硬编码为长整型。现在它可以工作了,我一直在尝试修改代码以使用泛型,以便我可以使用相同的代码来处理多个类型。
在分配内存和正确索引数组时,我需要一个指向相同类型的指针数组,即长整型数组需要long*[] myLargeArray。问题是当我使用泛型时,声明变成了T*[] myLargeArray,这总是会产生错误'Cannot take the address of, get the size of, or declare a pointer to a managed type ('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];
            ...
        }
    }

2个回答

12
根据 C#编程指南,以下任何一种类型都可以是指针类型:
  • sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal 或 bool
  • 任何枚举类型。
  • 任何指针类型。
  • 任何仅包含非托管类型字段的用户定义结构类型。
当您在泛型类型上放置struct约束时,编译器没有足够的信息来推断出所有以上要求将被满足(特别是最后一点)。
由于C#中没有模板,您可能希望考虑为有意义的数字类型创建数组/指针适配器的重载,或者创建一个工厂类,它可以根据某种类型的大小创建一个LargeArray

我认为工厂模式绝对是这里的最佳选择。 - Tamás Szelei

0

来自MSDN

即使在使用unsafe关键字时,也不允许获取托管对象的地址、获取托管对象的大小或声明指向托管类型的指针。有关更多信息,请参阅Unsafe Code and Pointers (C#编程指南)。

另外,我不知道你是否了解,但请确保在你的代码中使用fixed keyword


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接