zoukankan      html  css  js  c++  java
  • MSIL实用指南-struct的生成和操作


    struct(结构)是一种值类型,用于将一组相关的信息变量组织为一个单一的变量实体。所有的结构都继承自System.ValueType类,因此是一种值类型,也就是说,struct实例分配在线程的堆栈(stack)上,它本身存储了值,而不包含指向该值的指针。


    一、声明struct
    和声明class一样,用ModuleBuilder的DefineType方法,但是要求第二个参数是TypeAttributes.Sealed,第三个参数是typeof(ValueType)。
    实例:
    var typeBuilder = moduleBuilder.DefineType(
    "MyStruct,
    TypeAttributes.Public ,
    typeof(ValueType)
    );

    二、操作字段、方法、属性
    这些和在class生成各成员一致。


    三、struct作为参数的相关操作

    1.加载struct
    和一般加载参数一致,用Ldarg_X类指令

    2.加载struct的字段
    用Ldarga或Ldarga_S指令把参数地址加载到栈上,再用Ldfld指令加载字段。
    Ldarga_S是Ldarga的短格式指令

    3.保存到struct的字段
    用Ldarga或Ldarga_S指令把参数地址加载到栈上,再用Sdfld指令加载字段。

    4.调用struct的方法
    用Ldarga或Ldarga_S指令把参数地址加载到栈上,再用Call类指令调用方法。

    5.保存struct
    和一般保存参数一致,用Starg_X类指令

    四、struct作为局部变量的相关操作

    1.加载struct
    和一般加载局部变量一致,用Ldloc_X类指令

    2.加载struct的字段
    用Ldloca或Ldloca_S指令把参数地址加载到栈上,再用Ldfld指令加载字段。
    Ldloca_S是Ldloca的短格式指令

    3.保存到struct的字段
    用Ldloca或Ldloca_S指令把参数地址加载到栈上,再用Sdfld指令加载字段。

    4.调用struct的方法
    用Ldloca或Ldloca_S指令把参数地址加载到栈上,再用Call类指令调用方法。

    5.保存struct
    和一般保存局部变量一致,用Stloc_X类指令

    四、struct作为字段的相关操作

    1.加载struct
    和一般加载字段一致,先生成加载this,再用Ldfld类指令

    2.加载struct的字段
    先生成加载this,再用Ldflda指令把加载这个struct字段地址,再用Ldfld指令加载字段。
    Ldflda_S是Ldflda的短格式指令

    3.保存到struct的字段
    先生成加载this,再用Ldflda指令把struct字段地址加载到栈上,再用Sdfld指令加载字段。

    4.调用struct的方法
    先生成加载this,再用Ldflda指令把struct字段地址加载到栈上,再用Call类指令调用方法。

    5.保存struct
    和一般保存字段一致,用Stfld类指令

  • 相关阅读:
    204. Count Primes (Integer)
    203. Remove Linked List Elements (List)
    202. Happy Number (INT)
    201. Bitwise AND of Numbers Range (Bit)
    200. Number of Islands (Graph)
    199. Binary Tree Right Side View (Tree, Stack)
    198. House Robber(Array; DP)
    191. Number of 1 Bits (Int; Bit)
    190. Reverse Bits (Int; Bit)
    189. Rotate Array(Array)
  • 原文地址:https://www.cnblogs.com/tkt2016/p/8875324.html
Copyright © 2011-2022 走看看