OpCodes.Unaligned 字段
指示当前位于计算堆栈上的地址可能没有与紧接的 ldind、stind、ldfld、stfld、ldobj、stobj、initblk 或 cpblk 指令的自然大小对齐。
**命名空间:**System.Reflection.Emit
**程序集:**mscorlib(在 mscorlib.dll 中)
语法
声明
Public Shared ReadOnly Unaligned As OpCode
用法
Dim value As OpCode
value = OpCodes.Unaligned
public static readonly OpCode Unaligned
public:
static initonly OpCode Unaligned
public static final OpCode Unaligned
public static final var Unaligned : OpCode
备注
下表列出了指令的十六进制和 Microsoft 中间语言 (MSIL) 汇编格式,以及简短的参考摘要:
格式 |
汇编格式 |
说明 |
---|---|---|
FE 12 < unsigned int8 > |
未对齐。 alignment |
指示后面的指针指令可以是未对齐的。 |
堆栈转换行为依次为:
- 将地址推送到堆栈上。
Unaligned 指定堆栈上的地址(非托管指针,natural int)可能没有与紧接着的 ldind、stind、ldfld、stfld、ldobj、stobj、initblk 或 cpblk 指令的自然大小对齐。也就是说,对于 Ldind_I4 指令,地址的对齐可以不是对于 4 字节边界的。对于 initblk 和 cpblk 而言,默认的对齐是依赖结构的(在 32 位 CPU 上为 4 字节,在 64 位 CPU 上为 8 字节)。如果在编译时不知道对齐是 8 字节的,则不将其输出限制为 32 位词大小的代码生成器必须使用 unaligned。
对齐值必须是 1、2 或 4,并且这意味着生成的值应假定地址分别是字节、双字节或四字节对齐的。请注意,瞬态指针(* 类型)始终是对齐的。
尽管 cpblk 指令的对齐逻辑上要求两个数字(一个用于源,一个用于目标),但如果只指定较低数字,这对性能并没有显著的影响。
可以按任意顺序组合 unaligned 和 volatile 前缀。它们必须紧接在 ldind、stind、ldfld、stfld、ldobj、stobj、initblk 或 cpblk 指令的前面。对于 Ldsfld 和 Stsfld 指令只允许使用 Volatile 前缀。
下面的 Emit 方法重载可以使用 unaligned 操作码:
ILGenerator.Emit(OpCode, Label)
ILGenerator.Emit(Opcode, long)
平台
Windows 98、Windows 2000 SP4、Windows Millennium Edition、Windows Server 2003、Windows XP Media Center Edition、Windows XP Professional x64 Edition、Windows XP SP2、Windows XP Starter Edition
.NET Framework 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求。
版本信息
.NET Framework
受以下版本支持:2.0、1.1、1.0