CIL评估堆栈可以包含值类型吗?

Tri*_*ian 5 .net clr cil value-type

我对值类型和CIL评估堆栈有点困惑.ECMA-335,Partition III,§1.1表示CLI处理这些"基本CLI类型":

  • 完整数值类型的子集(int32,int64,native int和F).

  • 对象引用(O),不区分引用的对象类型.

  • 指针类型(本机unsigned int和&),没有区分指向的类型.

分区II,§12.1还提供了一个类似的列表,它排除了值类型,并指出:

但是,CLI在其操作中仅支持存储在其评估堆栈-int32,int64和native int上的值的这些类型的子集.

除了通过托管指针类型之外,这没有提及值类型.然而ldfld,例如,规范说:

ldfld指令将obj字段的值推入堆栈.obj应该是一个对象(类型O),一个托管指针(类型&),一个非托管指针(类型为native int),或一个值类型的实例.

这是否意味着值类型可以直接在评估堆栈上推送(而不是通过托管指针)?如果是这样,我可以假设被推送的值类型是原始的成员副本(例如,字段值)吗?

Dan*_*ker 1

ISO/IEC 23271:2012 (CLI 规范)的 I.12.3.2.1 节规定了以下内容:

\n\n
\n

虽然 CLI 通常支持 \xc2\xa7I.12.1 中描述的全套类型,但 CLI 以特殊方式处理计算堆栈。虽然某些 JIT 编译器可能会更详细地跟踪堆栈上的类型,但 CLI 仅要求值是以下之一:

\n\n
    \n
  • int64, 8 字节有符号整数
  • \n
  • int32, 4 字节有符号整数
  • \n
  • native int,4 或 8 字节的有符号整数,以对目标体系结构更方便的为准
  • \n
  • F,浮点值(float32、float64 或底层硬件支持的其他表示形式)
  • \n
  • &, 托管指针
  • \n
  • O, 对象引用
  • \n
  • *,一个 \xe2\x80\x9c 瞬态指针,\xe2\x80\x9d 只能在单个方法体内使用,它指向已知位于非托管内存中的值(有关更多详细信息,请参阅 CIL 指令集规范.* 类型是在 CLI 内部生成的;它们不是由用户创建的)。
  • \n
  • 用户定义的值类型
  • \n
\n
\n\n

所以,是的,计算堆栈可以包含值类型。并且该值类型被复制。

\n