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),或一个值类型的实例.
这是否意味着值类型可以直接在评估堆栈上推送(而不是通过托管指针)?如果是这样,我可以假设被推送的值类型是原始的成员副本(例如,字段值)吗?
ISO/IEC 23271:2012 (CLI 规范)的 I.12.3.2.1 节规定了以下内容:
\n\n\n\n\n虽然 CLI 通常支持 \xc2\xa7I.12.1 中描述的全套类型,但 CLI 以特殊方式处理计算堆栈。虽然某些 JIT 编译器可能会更详细地跟踪堆栈上的类型,但 CLI 仅要求值是以下之一:
\n\n\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 归档时间: |
|
查看次数: |
360 次 |
最近记录: |