获取给定 System.Type 的结构的大小

发布于 2024-10-08 07:11:29 字数 249 浏览 3 评论 0原文

给定一个结构 MyStruct,我可以在不安全代码中使用 sizeof(MyStruct) 获取该结构实例的大小。但是,我想在给定结构体的 Type 对象的情况下获取结构体的大小,即 sizeof(typeof(MyStruct))。有 Marshal.SizeOf,但它返回非托管编组大小,而我想要该结构的托管大小。

Given a struct MyStruct, I can get the size of instances of that struct using sizeof(MyStruct) in unsafe code. However, I want to get the size of a struct given the Type object for the struct, ie, sizeof(typeof(MyStruct)). There is Marshal.SizeOf, but that returns the unmanaged marshalled size, whereas I want the managed size of that struct.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

本宫微胖 2024-10-15 07:11:29

没有记录的方法来发现托管结构的布局。 JIT 编译器很容易利用这一点,它将重新排序结构的字段以获得最佳打包。按照 [StructLayout] 属性的指示,始终需要编组来获得可预测的布局。您必须跳过Marshal.StructureToPtr()这一环。无论您自己做还是让 pinvoke marshaller 为您做。

Marshal.SizeOf(Type) 为您提供封送的struct 的大小。有关其工作原理的更多背景信息,请参阅 这个答案

There is no documented way to discover the layout of a managed struct. The JIT compiler takes readily advantage of this, it will reorder fields of the struct to get the best packing. Marshaling is always required to get a predictable layout, as directed by the [StructLayout] attribute. You have to jump through the Marshal.StructureToPtr() hoop. Whether you do it yourself or let the pinvoke marshaller do it for you.

Marshal.SizeOf(Type) gives you the size of the marshaled struct. More background on why it works this way is available in this answer.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文