Block的底層實(shí)現(xiàn)(二):截獲變量的Block

接著上一篇
接下來,添加一下參數(shù)看看

int main(){
    int dmy = 256;
    int val = 10;
    const char *fmt = "val = %d\n";
    void (^blk)(void) = ^{
        printf(fmt,val);
    };
    val = 2;
    fmt = "These value were changed. val = %d\n";
    blk();
    return 0;
}

通過之前的clang命令編譯一下,得到以下的代碼


屏幕快照 2017-08-25 下午10.20.03.png

首先看一下相同的部分,從上面可以看出來__main_block_desc_0和__block_impl是相同,然后看一下不同的地方__main_block_impl_0的聲明以及初始化;
聲明部分可以看到,之前使用的自動(dòng)變量通過block語法作為成員變量追加到__main_block_impl_0結(jié)構(gòu)體中,__main_block_impl_0結(jié)構(gòu)體的成員變量類型的聲明與自動(dòng)變量的類型完全相同。注意,Block語法表達(dá)式中沒有用到的自動(dòng)變量不會(huì)被追加。
下面是初始化該結(jié)構(gòu)體實(shí)例的構(gòu)造函數(shù)的差異:

__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, const char *_fmt, int _val, int flags=0) : fmt(_fmt), val(_val)

在初始化結(jié)構(gòu)體實(shí)例時(shí),根據(jù)傳遞給構(gòu)造函數(shù)的參數(shù)對(duì)由自動(dòng)變量追加的成員變量進(jìn)行初始化。
接下里時(shí)使用Block的匿名函數(shù)的實(shí)現(xiàn)。

static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
  const char *fmt = __cself->fmt; // bound by copy
  int val = __cself->val; // bound by copy
        printf(fmt,val);
  }

之前聲明定義的__main_block_impl_0結(jié)構(gòu)體實(shí)例的成員變量的自動(dòng)變量被使用到了Block語法表達(dá)式中。
總的來說,截獲到的自動(dòng)變量作為成員變量被追加到__main_block_impl_0結(jié)構(gòu)體中,在Block語法表達(dá)式執(zhí)行時(shí),再賦值給與之前相同表達(dá)式的自動(dòng)變量。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容