91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

opcode操作數的類型介紹

發布時間:2020-07-02 11:23:21 來源:億速云 閱讀:178 作者:Leah 欄目:編程語言

本篇文章為大家展示了opcode操作數的類型介紹,代碼簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

zend_op_array.opcodes 指向指令列表,具體每條指令的結構如下:

struct _zend_op {  //  *opline  *opcodes
    const void *handler; //指令執行handler
    znode_op op1; //操作數1
    znode_op op2; //操作數類型實際就是個32位整形,它主要用于存儲一些變量的索引位置、數值記錄等等
    znode_op result; //返回值
    uint32_t extended_value;
    uint32_t lineno;
    zend_uchar opcode; //opcode指令
    zend_uchar op1_type; //操作數1類型
    zend_uchar op2_type;
    zend_uchar result_type; //返回值類型
};

//操作數結構
//比如賦值語句:"$a = 45;",兩個操作數分別記錄"$a"、"45"的存儲位置,執行時根據op2取到值"45",
//然后賦值給"$a",而"$a"的位置通過op1獲取到
//當然操作數并不是全部這么用的,上面只是賦值時候的情況,其它操作會有不同的用法
//如函數調用時的傳參,op1記錄的就是傳遞的參數是第幾個,op2記錄的是參數的存儲位置,
//result記錄的是函數接收參數的存儲位置。
typedef union _znode_op { //操作數類型實際就是個32位整形,它主要用于存儲一些變量的索引位置、數值記錄等等
    uint32_t      constant; //操作數記錄著當前指令的關鍵信息, 可以用于變量的存儲、訪問
    uint32_t      var;
    uint32_t      num;
    uint32_t      opline_num; /*  Needs to be signed */
#if ZEND_USE_ABS_JMP_ADDR
    zend_op       *jmp_addr;
#else
    uint32_t      jmp_offset;
#endif
#if ZEND_USE_ABS_CONST_ADDR
    zval          *zv;
#endif
} znode_op;
//操作數有5種不同的類型;
#define IS_CONST    (1<<0)  //字面量,編譯時就可確定且不會改變的值,比如:$a = "hello~",其中字符串"hello~"就是常量
#define IS_TMP_VAR  (1<<1) //臨時變量 $a = "hello~" . time(),其中"hello~" . time()的值類型就是IS_TMP_VAR
                            //"123" + $b的結果類型也是IS_TMP_VAR,從這兩個例子可以猜測,臨時變量多是執行期間其它
   //類型組合現生成的一個中間值,由于它是現生成的,所以把IS_TMP_VAR賦值給IS_CV變量時不會增加其引用計數
#define IS_VAR      (1<<2)//PHP變量
                          //這個很容易認為是PHP腳本里的變量,其實不是,這里PHP變量的含義可以這樣理解:PHP變量是沒有顯
                          //式的在PHP腳本中定義的,不是直接在代碼通過$var_name定義的
   //。這個類型最常見的例子是PHP函數的返回值,再如$a[0]數組這種,它取出的值也是IS_VAR,再比如$$a這種
#define IS_UNUSED   (1<<3)  /* Unused variable */   //表示操作數沒有用
#define IS_CV       (1<<4)  /* Compiled variable */
   //PHP腳本變量,即腳本里通過$var_name定義的變量,這些變量是編譯階段確定的,所以是compile variable

   //result_type除了上面幾種類型外還有一種類型EXT_TYPE_UNUSED (1<<5),返回值沒有使用時會用到,
   //這個跟IS_UNUSED的區別是:IS_UNUSED表示本操作返回值沒有意義(也可簡單的認為沒有返回值),
   //而EXT_TYPE_UNUSED的含義是有返回值,但是沒有用到,比如函數返回值沒有接收

上述內容就是opcode操作數的類型介紹,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

旅游| 嘉峪关市| 高唐县| 乐安县| 台东市| 陆丰市| 简阳市| 汶上县| 毕节市| 博白县| 和平县| 肇州县| 旅游| 盐亭县| 安远县| 府谷县| 昌江| 阳原县| 沭阳县| 安岳县| 沐川县| 额济纳旗| 临清市| 永康市| 怀仁县| 黄骅市| 札达县| 新宁县| 嘉善县| 卓尼县| 个旧市| 新昌县| 青河县| 崇仁县| 涞源县| 江永县| 长子县| 龙川县| 宁强县| 道真| 饶河县|