Portál AbcLinuxu, 8. května 2025 01:15
Z toho C kódu co jsem viděl, to pak vypadá, že co volání funkce, to kontrola výstupového kódu a reakce na chybový stav. Pak 2/3 kódu funkce je "nerelevatní" k primárnímu poslání funkce. To mi opravdu nepřijde výhodné.A jaký kód jsi viděl;)?
Že je to rychlejší? To bych se divil. Vždyť je za každým voláním funkce testování podmínky. U vyjímek nic takového není, kód je výrazně lineárnější.Testování podmínky při návratu z funkce jsou 2 instrukce. Pokud nechci psát IF, tak můžu použít makro.
Že je zpracování vyjímek pomalé? No a co, vyjímky jsou od toho vyjímky, že jsou vyjímečné.Otázka zůstává pořád stejná, na co všechno chceš použít výjimky? Já bych třeba pro chybnou alokaci paměti použil spíš výjimku, ale u chyby při otevírání souboru raději chybový kód. Možná je problém v tom, že se na C++ díváš jako na Javu. Pro mě jsou to 2 odlišné světy. Chtít po C++ aby to bylo jak Java, nebo naopak, prostě nemá cenu.
2 instrukce jsou stále pomalejší než žádná instrukce jako je tomu při použití vyjímek ;) Prostě vaše tvrzení, že návratové kódy jsou rychlejší, není pravdivé.2 instrukce jsou naprosto zanedbatelné, když bereš v úvahu volání funkce. Navíc pokud je volaná funkce inline, tak testování návratové hodnoty odpadá úplně (ten jump se vygeneruje už v té inline funkci).
A to byla moje pointa. Že je to nárůst nepatrný vám neberu.Při povolení výjimek je nárůst binárky mnohem větší, než při zpracování návratové hodnoty. Důvod je ten, že ty unwind tabulky se někam musí uložit. Navíc každá "exception enabled" funkce musí obsahovat peciální prolog a epilog.
Například kód Firefoxu. Řádky jako: if (NS_FAILED(rv)) return rv;Já osobně používám RETURN_ON_ERROR(kód), nenaroste počet řádků a v 90% situací postačuje. Jinak kód FF je zrovna velmi špatný příklad;)
Java vs. C++ jako jazyk, ne jako JVM versus nativní kód, samozřejmě srovnávat lze. Java je jazyk z C++ vzešlý, snažila se vyhnout chybám předchůdce, a vesměs se jí to i podařilo.Já si zase myslím, že C# se vyhl chybám Javy, a můžeme se tu hádat;)
Proč Cckaři nepoužívají vyjímky je dán historicky. Starší kompilátory neměli dobrou implementaci (alespoň se to všude tvrdí), programátoři se je nenaučili používat.I nové projekty, např. Chromium nebo V8 nepoužívají výjimky. Hodit všechno do jednoho pytle nejde. Jsou situace, kdy jsou výjimky zbytečné, a platit za ně daň v podobě většího a pomalejšího kódu nemá smysl. Druhá věc je ta, že pokud vytvořím knihovnu, která používá výjimky, tak ji už nikdo nemůže použít v kódu, který ty výjimky nepoužívá.
Samozřejmě bych volil vyjímku. Jestliže nastane vyjímka, což znamená chybu, neb chyba by vždy měla být vyjímečně, ideálně vůbec, čili jasně vyjímka, není nad čím mudrovat. Něco jiného je otázka, zda soubor kam budu zapisovat nejdříve otestovat, zda je zapisovatelný, nebo to "risknout" a nechat to "spadnout" až na operaci samotné. Záleží jak moc analyzujete stav jako vyjímečný, záleží na kontextu. Každopádně by ale knihovní funkce/metoda pro zápis neměla vracet úspěšnost v podobě kódu.Pro mě osobně ta situace není nijak výjimečná. I kdybych si otestoval, zda soubor X.Y můžu otevřít, tak během doby, než zavolám open(), ten soubor už může být třeba smazaný. Takže ve výsledku se ta výjimka stejně musí odchytit a zpracovat (jen v podobě větší režie).
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.