estli je goto v assembleru pouze instrukce JMP (a jeji vysledek ve strojovem kodu je vlastne take jenom skok na adresu), pak by melo goto teoreticky zkracovat strojovy kod, nez goto obchazet.
Ano, jedná se o jednu JMP instrukci (na ia32/x64, ale myslím, že na většině architektur to bude stejné).
Nemyslím, že by explicitní použití goto zdrojáky výrazně zkracovalo ve výše diskutovaných případech. Při vyskakování ze zanořeného cyklu ven vám ušetří pár podmínek (což obvykle je pár instrukcí).
Většinu kódu stejně netvoří skoky.
Co se týče té mojí ukázky, tam byste musel prostě místo goto volat ty finit funkce a pak dělat return. Nebo ten kód přepsat na něco jako:
err = a_init();
if (!err) {
err = b_init();
if (!err) {
err = c_init();
. . .
}
b_finit();
}
a_finit();
}
return err;
Tím se goto zbavíte, ale zase se tam přidává indentace, takže když těch init funkcí máte hodně, nedá se to číst ("ujíždí" to doprava). A někdo zase může preferovat ten způsob s goto.
Také nezapomeňte na to, že i když voláte ty finit funkce opakovaně, moc tím kód neprodulužujete, protože volání znamená jen pár instrukcí pro předání parametrů a instrukci CALL pro samotný skok na danou funkci.
Ta čitelnost je důležitá. Standardní konstrukty jako if, for, while, do-while, switch v sobě nějakou formu skoku mají ukrytou (podmíněnou či nepodmíněnou), ale vždy víte, kam se máte dívat, pokud třeba chcete vidět, co je za koncem cyklu (kudy to "vede" dál). Pokud budete používat goto a prostě skákat na různá návěští bez dodržování nějaké konvence, musíte si při čtení pamatovat, kde ta návěští jsou (a tak nějak si pamatovat ten graf možných skoků).