Clang, bloky a std::function

11. 4. 2012 17:16 zboj

Uživatele clangu potěší, že můžou napsat něco jako

std::function<void()> lambda = ^{ /* neco */ };

(Při překladu je nutné použít volbu -stdlib=libc++, se standardním libstdc++ se kód nepřeloží.)

Člověk by přitom naivně předpokládal, že vzhledem k explicitní deklaraci se už o správu paměti nemusí starat. Jenže pokud proměnnou lambda například vrátíte z funkce, blok zanikne (protože je na zásobníku). Zdá se, že pro vývojáře clangu je více než bezpečnost důležitější maximální výkon (a proto nechávají blok na zásobníku). Dokud tedy nebude clang podporovat lambda výrazy podle C++11, zůstaneme odkázáni na vlastní wrapper, jenž korektně (a transparentně) překopíruje blok v případě potřeby ze zásobníku na haldu.

Sdílet