c# - Marshal.SizeOf(typeof(IntPtr)) 与 sizeof(IntPtr)

标签 c# .net

我知道 Marshal.SizeOf()sizeof() 有多么根本的不同。但是在 IntPtr 的情况下,无论 CPU 架构如何,它们都不会总是返回完全相同的东西吗?

最佳答案

一方面,有原始类型:

| <b>x64</b> | <b>x86</b>
| Marshal. | Marshal.
Primitive | SizeOf<T>() sizeof(T) | SizeOf<T>() sizeof(T)
========= | =========== =========== | =========== ===========
Boolean | 4 <-> 1 | 4 <-> 1
Byte | 1 1 | 1 1
SByte | 1 1 | 1 1
Int16 | 2 2 | 2 2
UInt16 | 2 2 | 2 2
Int32 | 4 4 | 4 4
UInt32 | 4 4 | 4 4
Int64 | 8 8 | 8 8
UInt64 | 8 8 | 8 8
IntPtr | 8 8 <-> 4 4
UIntPtr | 8 8 <-> 4 4
Char | 1 <-> 2 | 1 <-> 2
Double | 8 8 | 8 8
Single | 4 4 | 4 4

除此之外,对于 .NET 中的结构 ( ValueType ) 实例,内部托管布局和编码(marshal)处理图像之间可能存在显着差异,无论是在总大小还是字段布局顺序上。后者甚至对于所谓的 formatted classes 也是如此。 .[1]

实际上很少需要有关实际托管结构布局的信息,事实上 .NET 竭尽全力试图使其无法被发现。您也不能影响结构的内部布局,这正是 Marshal 的原因。层提供了专门声明互操作所需的任何布局的能力。

这是一个需要知道结构的运行时内存镜像的真实大小的用例:假设您正在使用结构的托管数组来实现某种存储 blob 概念,并且您希望每个 block (即数组)保留在固定的总分配大小下,比如 ~84,800 字节——显然在这种情况下要远离 LOH .您希望此存储类是一个通用类,用任意 ValueType 参数化定义“记录”或表条目的类型。要确定可以进入每个托管数组 block 的结构数量,您需要发现运行时给出的结构的真实大小,因此您可以将 84,800 除以该值。

更详细地检查编码(marshal)处理托管内部 结构布局之间可能出现的差异、填充和大小,请参阅我对“How do I check the number of bytes consumed by a structure?”的扩展回答



[1.]“格式化类是一种引用类型,其布局由 StructLayoutAttribute 属性指定为 LayoutKind.ExplicitLayoutKind.Sequential。”
<子> https://msdn.microsoft.com/en-us/library/2zhzfk83(v=vs.110).aspx

关于c# - Marshal.SizeOf(typeof(IntPtr)) 与 sizeof(IntPtr),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41462254/

相关文章:

c# - 无法将 cls 文件导入到 sql server 2005

c# - 在 asp.net 中使用 croppic

c# - 逐帧播放mp3

c# - Toolbox Winforms .NET 6 中没有 WebBrowser 控件

c# - 根据 ComboBox 中选定的索引项获取工作表

.net - Python,使用完整的.NET?

.net - 长时间保持数据库连接打开是否安全

c# - 将缺失的月份计数为零 (0) 并填充到数据表中

c# - 通过 OpenId Connect 身份验证传递查询字符串参数

c# - 使用 linq 取出 foreach