OpCodes.Unaligned 字段

定义

指示当前位于计算堆栈上的地址可能没有与紧接的 ldindstindldfldstfldldobjstobjinitblkcpblk 指令的自然大小对齐。

public static readonly System.Reflection.Emit.OpCode Unaligned;

字段值

注解

下表列出了指令的十六进制和 Microsoft 中间语言 (MSIL) 程序集格式,以及简短的参考摘要:

格式 程序集格式 说明
FE 12 <unsigned int8> 未对齐。 alignment 指示后续指针指令可能未对齐。

堆栈过渡行为(按顺序排列)为:

  1. 将地址推送到堆栈上。

Unaligned指定 (非托管指针的地址, native int 堆栈上的) 可能与 、 或 cpblk 指令之后ldobjstindinitblkldindldfldstfldstobj的自然大小不一致。 也就是说,对于 Ldind_I4 指令,地址的对齐方式可能不是 4 字节边界。 对于 initblkcpblk 默认对齐方式依赖于体系结构 (32 位 CPU 上的 4 字节,8 字节的 64 位 CPU) 。 如果编译时不知道对齐方式为 8 字节,则不将其输出限制为 32 位字大小的代码生成器必须使用 unaligned

对齐的值必须为 1、2 或 4,这意味着生成的代码应假定地址分别与字节、双字节或四字节对齐。 请注意, (类型 *) 的暂时指针始终对齐。

虽然指令的对齐方式在逻辑上需要两个 cpblk 数字 (一个用于源,另一个用于目标) ,但如果只指定较小的数字,则不会对性能产生明显影响。

unalignedvolatile 前缀可以按任一顺序组合。 它们必须紧跟在 、、、stindstfldldfldldobjstobjinitblkcpblk 指令之前ldindVolatileStsfld 指令仅允许Ldsfld前缀。

以下 Emit 方法重载可以使用 unaligned opcode:

适用于

产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0