Jedna z hlavních výhod jazyka, zmiňovaná v úvodu, je garbage collector. Jak je to v porovnání s dnešním C++11 a výš, který všude tlačí smart pointery?
Raw pointer už se v moderním kódu C++ téměř nevyskytuje, new a delete se díky smart pointerům také upozaďuje, takže z mého C++ pohledu mi přijde, že funkci garbage collectoru zde řeší správa paměti smart pointerů samotných.
Oboje má trochu jiné vlastnosti, i když s projevují až v extrémnějších situacích.
GC má rychlejší alokaci, jen se přičte k pointeru. Moc tam nehrozí fragmentace paměti. malloc musí hledat volný blok paměti a i uvolňování chvíli trvá. Zase tam nejsou pauzy na GC, i když pauzy jsou u novějších generačních GC omezené. A i fragmentace u novějších implementací haldy není až tak zlá. Stručně, u malloc je drahá alokace/dealokace paměti, u GC je nákladné dlouhé držení alokované paměti. Jak dobrý GC má teď go netuším, ale v začátcích byl dost špatný.
U smart pointerů je třeba si dát pozor na cykly. Tvrdí se, že GC tím netrpí, ale není to úplně pravda. Stačí nějaký callback a i jazyk s GC může leakovat.
Co u GC jazyka nehrozí je přetečení zásobníku při uvolňování dlouhého řetězu smart pointerů. Pokud je v C++ problém rekurzivní volání řady destruktorů, pak je třeba to uvolňování ručně přepsat na smyčku. Ale u běžných datových struktur nebývají úrovně zanoření takové, aby to nějak moc nastávalo.
Co jsou to "malé pauzy" dost záleží na kontextu. Tam, kde se pohybuju já, jsou jednotky ms sakra hodně. Ale já rozhodně nedělám věci, na které je go navržené. :)
S tím callbackem jsem to myslel tak, že skrz callbacky do jiných knihoven můžou vzniknout cykly které GC neuklidí. Ony ty hranice do jiných jazyků jsou problematické tak nějak obecně.