<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                在函數調用的執行代碼中我們會看到這樣一些強制轉換: EX(function_state).function = (zend_function *) op_array; ? 或者: ? EG(active_op_array) = (zend_op_array *) EX(function_state).function; 這些不同結構間的強制轉換是如何進行的呢? 首先我們來看zend_function的結構,在Zend/zend_compile.h文件中,其定義如下: typedef union _zend_function { zend_uchar type; /* MUST be the first element of this struct! */ ? struct { zend_uchar type; /* never used */ char *function_name; zend_class_entry *scope; zend_uint fn_flags; union _zend_function *prototype; zend_uint num_args; zend_uint required_num_args; zend_arg_info *arg_info; zend_bool pass_rest_by_reference; unsigned char return_reference; } common; ? zend_op_array op_array; zend_internal_function internal_function; } zend_function; 這是一個聯合體,我們來溫習一下聯合體的一些特性。聯合體的所有成員變量共享內存中的一塊內存,在某個時刻只能有一個成員使用這塊內存,并且當使用某一個成員時,其僅能按照它的類型和內存大小修改對應的內存空間。我們來看看一個例子: #include <stdio.h> #include <stdlib.h> ? int main() { typedef union _utype { int i; char ch[2]; } utype; ? utype a; ? a.i = 10; a.ch[0] = '1'; a.ch[1] = '1'; ? [printf](http://www.opengroup.org/onlinepubs/009695399/functions/printf.html)("a.i= %d a.ch=%s",a.i, a.ch); getchar(); ? return (EXIT_SUCCESS); } 程序輸出:a.i= 12593 a.ch=11當修改ch的值時,它會依據自己的規則覆蓋i字段對應的內存空間。'1'對應的ASCII碼值是49,二進制為00110001,當ch字段的兩個元素都為'1'時,此時內存中存儲的二進制為 00110001 00110001轉成十進制,其值為12593。 回過頭來看zend_function的結構,它也是一個聯合體,第一個字段為type,在common中第一個字段也為type,并且其后面注釋為/* Never used*/,此處的type字段的作用就是為第一個字段的type留下內存空間。并且不讓其它字段干擾了第一個字段。我們再看zend_op_array的結構: struct _zend_op_array { /* Common elements */ zend_uchar type; char *function_name; zend_class_entry *scope; zend_uint fn_flags; union _zend_function *prototype; zend_uint num_args; zend_uint required_num_args; zend_arg_info *arg_info; zend_bool pass_rest_by_reference; unsigned char return_reference; /* END of common elements */ ? zend_bool done_pass_two; ....// 其它字段 } 這里的字段集和common的一樣,于是在將zend_function轉化成zend_op_array時并不會產生影響,這種轉變是雙向的。 再看zend_internal_function的結構: typedef struct _zend_internal_function { /* Common elements */ zend_uchar type; char * function_name; zend_class_entry *scope; zend_uint fn_flags; union _zend_function *prototype; zend_uint num_args; zend_uint required_num_args; zend_arg_info *arg_info; zend_bool pass_rest_by_reference; unsigned char return_reference; /* END of common elements */ ? void (*handler)(INTERNAL_FUNCTION_PARAMETERS); struct _zend_module_entry *module; } zend_internal_function; 同樣存在公共元素,和common結構體一樣,我們可以將zend_function結構強制轉化成zend_internal_function結構,并且這種轉變是雙向的。 總的來說zend_internal_function,zend_function,zend_op_array這三種結構在一定程序上存在公共的元素,于是這些元素以聯合體的形式共享內存,并且在執行過程中對于一個函數,這三種結構對應的字段在值上都是一樣的,于是可以在一些結構間發生完美的強制類型轉換。可以轉換的列表如下: - zend_function可以與zend_op_array互換 - zend_function可以與zend_internal_function互換 但是一個zend_op_array結構轉換成zend_function是不能再次轉變成zend_internal_function結構的,反之亦然。 其實zend_function就是一個混合的數據結構,這種結構在一定程序上節省了內存空間。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看