OpCodes.Unaligned 字段
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
指示当前在评估堆栈上的地址可能与紧跟、、、ldind、、、、stind或ldfld指令的自然stfld大小不一致。 ldobjstobjinitblkcpblk
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)程序集格式,以及简短的参考摘要:
| Format | 程序集格式 | Description |
|---|---|---|
FE 12 <unsigned int8> |
未对齐。 alignment |
指示后续指针指令可能未对齐。 |
堆栈过渡行为按顺序排列,为:
- 地址被推送到堆栈上。
Unaligned指定堆栈上的地址(非托管指针)native int可能与紧跟、、ldind、stind、ldfld、stfldldobjstobj、或initblk指令的自然cpblk大小不一致。 也就是说,对于 Ldind_I4 指令,地址的对齐方式可能不是 4 字节边界。 对于 initblk 和 cpblk 默认对齐依赖于体系结构(4 字节(32 位 CPU 上的 4 字节,64 位 CPU 上的 8 字节)。 如果编译时不知道对齐方式为 8 字节,则不将其输出限制为 32 位字大小的代码生成器必须使用 unaligned 。
对齐值必须为 1、2 或 4,表示生成的代码应分别假定地址是字节、双字节或四字节对齐。 请注意,暂时性指针(类型 *)始终对齐。
虽然指令的 cpblk 对齐方式需要两个数字(一个用于源,另一个用于目标),但如果只指定较低的数字,则不会对性能产生明显影响。
unaligned可以按任一顺序组合前缀和volatile前缀。 它们必须紧接在指令ldind之前、、stind、ldfldstfldldobjstobj、或initblkcpblk指令之前。
Volatile仅允许前缀Ldsfld和Stsfld说明。
以下 Emit 方法重载可以使用 unaligned 操作码: