首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Marshal.SizeOf(typeof(IntPtr))与sizeof(IntPtr)

Marshal.SizeOf(typeof(IntPtr))与sizeof(IntPtr)
EN

Stack Overflow用户
提问于 2017-01-04 11:03:16
回答 1查看 3K关注 0票数 4

我知道Marshal.SizeOf()sizeof()有多么大的不同。但是在IntPtr的情况下,不管的体系结构如何,两个都会返回完全相同的东西吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-04 15:08:13

首先,你为什么想知道?如果您的代码编写得很好,您就不需要对sizeofMarshal.SizeOf返回的内容进行任何假设。您会使用封送器来封送任何IntPtr实例吗?然后使用Marshal.SizeOf。您的变量是否从未离开托管世界,还是正在使用自定义编组?然后使用sizeof (或IntPtr.Size,因为它不需要unsafe块)。在这两种情况下,您都不会关心它们是否返回相同的值。这才是实际的答案。

关于理论。根据C#语言规范sizeof(IntPtr)返回的值是“该类型变量中的字节总数,包括任何填充”(因为IntPtr是一个结构)。然而,它也注意到这个值是“实现定义的”。因此,如果您想获得技术,C#规范只是简单地说“想办法”。

尽管如此,IntPtr的文档清楚地表明,32位平台上的类型是32位,64位平台上是64位,而ECMA-335文档表明IntPtr是一种与native int相对应的特殊内置类型,所以我认为我们可以暂时得出结论,在任何声称遵循规范的实现上,sizeof(IntPtr)都是可预测的:4在32位平台上,8在64位平台上。IntPtr.Size是另一种选择,它显式地记录了这一点。

Marshal.SizeOf(typeof(IntPtr))是另一只野兽。除了“非托管类型的大小”之外,它并没有准确地记录它将返回的内容;在水下,它调用CLR中的一些本机代码,该代码请求TypeHelper提供基础类型的大小。对于IntPtr,这将返回sizeof(void*) (在C++中),当然,对于绝大多数C++编译器和平台,32位平台上有4条,64位平台上有8条。

从技术上讲,sizeof(IntPtr)Marshal.SizeOf(typeof(IntPtr))有可能有所不同。但这并不是你通常会关心的问题,因为运行时和抖动(或AOT编译器)的结合不使sizeof(IntPtr)等同于Marshal.SizeOf(typeof(IntPtr))是不明智的--否则运行时只会使自己的生活变得更加困难。另一方面,正如我所指出的,通常也没有任何理由需要依赖它们是相同的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41462254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档