与顺序布局和显式布局相比,StructLayout.Auto 意味着什么?

发布于 2025-01-04 09:33:29 字数 79 浏览 0 评论 0原文

我认为LayoutKind.Sequential和LayoutKind.Explicit很清楚,但是C#如何处理LayoutKind.Auto?

I think LayoutKind.Sequential and LayoutKind.Explicit are clear, but how is LayoutKind.Auto handled by C#?

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

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

发布评论

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

评论(4

感情废物 2025-01-11 09:33:29

LayoutKind.Auto 只是意味着“我授予 CLR 重新排序与这些字段对应的字节的权限”。它准确地决定如何重新组织内存使用、打包等字段。文档中没有指定具体会进行哪些更改,可能是因为它是与您编写结构的方式无关的实现细节。

如果您传递给非托管代码,这总是一件坏事,因为非托管代码期望这些字段按特定顺序排列。它们可能的重新排列必然会产生意想不到的后果。这就是为什么您不能将 LayoutKind.Auto 结构公开给非托管代码的原因。

LayoutKind.Auto just means, "I give the CLR permission to reorder the bytes corresponding to these fields". It decides exactly how to reorganize the fields for memory usage, packing, et cetera. Exactly which changes it will make isn't specified by the documentation, probably because it's an implementation detail that isn't relevant to how you write your structs.

This is invariably a bad thing if you're passing to unmanaged code, because unmanaged code expects those fields to be in a particular order. Their possible rearrangement is bound to have unintended consequences. That's why you can't expose LayoutKind.Auto structs to unmanaged code.

回眸一遍 2025-01-11 09:33:29

文档似乎很清楚:

运行时会自动选择合适的布局
非托管内存中对象的成员。用 this 定义的对象
枚举成员不能暴露在托管代码之外。
尝试这样做会产生异常。

换句话说,布局是动态的,意味着您的对象不能再在托管代码之外使用。

The documentation seems pretty clear:

The runtime automatically chooses an appropriate layout for the
members of an object in unmanaged memory. Objects defined with this
enumeration member cannot be exposed outside of managed code.
Attempting to do so generates an exception.

In other words, the layout is dynamic and means that your object can no longer be used outside of Managed Code.

故事与诗 2025-01-11 09:33:29

MS 说这里

公共语言运行时默认使用“自动布局”值。到
减少与 Auto 值、C# 相关的布局相关问题
Visual Basic 和 C++ 编译器为值指定顺序布局
类型。

MS says here

The common language runtime uses the Auto layout value by default. To
reduce layout-related problems associated with the Auto value, C#,
Visual Basic, and C++ compilers specify Sequential layout for value
types.

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