2017-08-16 58 views
2

當把外部聲明的變量成塊......性能差異通過__block捕捉塊外部變量VS那不

使用__block指令捕捉引用變量...

變量本地用__block存儲修飾符聲明的封閉詞法範圍由引用提供,因此是可變的。 任何更改都會反映在封閉的詞法範圍內,包括在同一個封閉詞法範圍內定義的任何其他塊。

沒有變量由值而拍攝...

塊的詞法範圍內聲明的局部變量,這完全一樣的功能,局部變量。 塊的每次調用都會提供該變量的新副本。這些變量可以反過來用作塊內封閉塊的const或by-reference變量。

我聽說過使用__block的效率較低,但這怎麼可能?你不會總是避免昂貴的副本嗎?

+0

相關:[塊如何捕獲其封閉範圍之外的變量?](https://stackoverflow.com/questions/17813870/how-does-a-block-capture-the-variables-outside-of - 封閉範圍/ 17819142#17819142) –

回答

2

你不會總是避免昂貴的副本嗎?

不,這不是昂貴的,因爲只有變量被複制。該變量是對對象的引用,因此通常是單個機器字。

被引用的對象本身不被複制。

+0

大聲笑我總是忘記這一點。蘋果讓它變得如此簡單。與編寫C++時相比。 – Gukki5

3

除非變量類型是一個巨大的結構或巨大的C++類,否則副本不會很貴。

即使您將其聲明爲__block,它最初會存儲在堆棧中(如本地變量),但如果使用它的任何塊被複制,它將被移動到堆中,並且此移動將涉及無論如何變量。