C# 新的IntPtr.Add方法-我是否遗漏了int的要点?

C# 新的IntPtr.Add方法-我是否遗漏了int的要点?,c#,.net,.net-4.0,intptr,pointer-arithmetic,C#,.net,.net 4.0,Intptr,Pointer Arithmetic,从FW 4.0开始,具有以下方法: 这很好,因为它应该能够解决所有关于IntPtr数学的问题(可能更多) 但是为什么偏移量是int呢? 它不能是IntPtr?我可以很容易地想象用一个超出int范围的值来偏移64位指针 例如,考虑: 它返回一个IntPtr作为结构成员的偏移量。这很有道理!而且,您无法轻松地将此偏移与新的Add方法一起使用。您必须将其强制转换为Int64,然后在循环中多次调用Add 而且,它似乎扼杀了IntPtr.Size与正确编写的应用程序无关的想法。必须将偏移量转换为特定类型

从FW 4.0开始,具有以下方法:

这很好,因为它应该能够解决所有关于
IntPtr
数学的问题(可能更多)

但是为什么偏移量是int呢?
它不能是
IntPtr
?我可以很容易地想象用一个超出
int
范围的值来偏移64位指针


例如,考虑:

它返回一个
IntPtr
作为结构成员的偏移量。这很有道理!而且,您无法轻松地将此偏移与新的
Add
方法一起使用。您必须将其强制转换为
Int64
,然后在循环中多次调用
Add

而且,它似乎扼杀了
IntPtr.Size
与正确编写的应用程序无关的想法。必须将偏移量转换为特定类型,例如
Int64
,此时必须开始管理大小差异。并想象当128位
IntPtr
出现时会发生什么


我的问题是,为什么?
我的结论是正确的,还是没有抓住要点?

如果您仅定义:

public static IntPtr Add(IntPtr pointer, IntPtr offset)
然后,向64位指针添加32位偏移量的可读性较差,IMHO

同样,如果你定义

public static IntPtr Add(IntPtr pointer, long offset)
然后,将64位偏移量添加到32位指针也是不好的


顺便说一下,Substract返回一个IntPtr,因此IntPtr逻辑无论如何都不会中断。

它对应于x64体系结构中的一个限制。相对寻址仅限于有符号32位偏移量值。Matt Pietrek在中提到了这一点(靠近“幸运的是,答案是否定的”)。此限制还解释了为什么.NET对象在64位模式下仍被限制为2GB。类似地,在原生x64 C/C++代码中,内存分配也受到限制。这并不是说这是不可能的,位移可以存储在64位寄存器中,只是这会使数组索引变得更加昂贵

神秘的Marshal.OffsetOf()返回类型可能是一个极端情况。托管结构在应用大于2GB的[StructLayout]和[Marshallas]后可能会产生非托管版本

是的,这不能很好地映射到未来的128位体系结构。但是,在没有人知道它会是什么样子的情况下,为arch准备今天的软件是非常困难的。也许古老的格言是正确的,16兆字节对任何人来说都应该足够了。除此之外还有很大的发展空间,2^64是一个相当大的数字。当前64位处理器仅实现2^48。一些严重的非琐碎问题需要在机器能够接近之前解决

public static IntPtr Add(IntPtr pointer, IntPtr offset)
public static IntPtr Add(IntPtr pointer, long offset)