OpCodes.Unaligned 字段

定义

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

public: static initonly System::Reflection::Emit::OpCode Unaligned;
public static readonly System.Reflection.Emit.OpCode Unaligned;
 staticval mutable Unaligned : System.Reflection.Emit.OpCode
Public Shared ReadOnly Unaligned As OpCode 

字段值

注解

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

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

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

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

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

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

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

unalignedvolatile 前缀可以按任一顺序组合。 它们必须紧接在 、、stind、、stfldldobjldfldstobjinitblkcpblk 指令之前ldindVolatile和 指令仅允许LdsfldStsfld前缀。

以下 Emit 方法重载可以使用 unaligned 操作码:

适用于