Hát, a full exception handling meglehetősen bonyolult, és én se vágom mélyebben. De sokkal több dolog van az exceptionnal, mint ahogy az ember elsőre gondolná. Az alapötlet az, hogy a kód mellé generálódik egy nagy táblázat. Amiben le van írva az, hogyha a fv -ek bizonyos pontjain exception miatti kilépés van, akkor mit kell csinálni (melyik objecteknek kell a dtor-ját meghívni). És amikor runtime throw van, akkor a táblázatból kikeresi az aktuális instruction pointer-hez tartozó részt, és lefuttatja a szükséges dolgokat. Aztán szépen egyenként felmászik a stack-en, és mindegyik frame-ben megnézi ugyanezt, hogy milyen objectet dtor-ját kell meghívni. Ill., azt is, hogy milyen exception handlerek vannak ott bejegyezve, hátha van handler, ami le tudja kezelni az aktuális exceptiont. De ez ennél nyilván bonyolultabb, csak valami ilyesmi a lényeg.Nem baj, ennyi is rávilágított a lényegre, köszi, hogy leírtad. Ez belül egy nagyságrenddel bonyolultabb, mint a C
malloc()-jai, if-jei és free()-jei. Úgyhogy akkor vissza az eredeti kérdésre: miért szar a C-ben az a pár elágazás, az miért pazarlás és miért jó ez a sokkal bonyolultabb hibakezelési mechanizmus C++-ban?Ez az, amit pl. meg tudsz spórolni, ha C++-t használsz C helyett. Itt szerintem teljesen egyértelmű a C++ előnye. Nagyon nem örülnék neki, ha minden allokálásnál csekkolgatnom kellene, hogy sikerült-e.Egyértelmű a C++ előnye, ha időre mész, de ha teljesítményre, vagy sebességre? Abból, amit leírtál, már érthető, hogy miért lassú, ha ténylegesen dobódik egy kivétel; egyesével visszamászni a stack-en és végignézegetni, hogy mit kell meghívni? Hát ez nem csoda, hogy lassú, ha ténylegesen kivétel keletkezik.
Itt nem igazán értem mire gondolsz. Ha C-ben is OOP módon programozol, akkor ugyanazok a dolgokat csinálod kézzel, mint amit a C++ neked alapból megad. Nem látom, hogy hol van itt a "C-ben kevesebb dolog".C-ben ha OOP módon programozok, akkor van egy
struct-om, meg egy raklap függvényem, ami azon operál. Itt a "konstruktor" kimerül egy malloc()-ban és annak lekezelésében, ami itt egy darab if, C++-ban meg az van, amit leírtál és gondolom, maguk az OOP részek sem sima struct-okra fordulnak le, hanem ott is lesz mindenféle referenciatáblázattól elkezdve minden egyéb adat és láthatatlan segédrutin is.Szerintem ebben nincs különbség a két nyelvben, feltéve, hogy almát hasonlítunk almával. Ha logikailag is ugyanazt kéred a két nyelvtől, akkor kb. ugyanazt fogod kapni.A nyelv "rejtett" részeiről beszéltem, nem arról, hogy C++-ban direkt nem a
qsort-ot hívom meg; amit te leírtál, ott nem is a nyelveket hasonlították össze. De ahogy leírtad, hogy mi van a C++ kivételkezelése között; C-ben ha a malloc() elhasal, azt egy darab if-el kezelem le, C++-ban meg kaphatom el a kivételt, amit a konstruktor elhasalása okozott, mögötte pedig az a mechanizmus húzódik meg, amit leírtál. A C egyértelműen kevesebb és gyorsabb kódot fog adni.Valami ilyesmi pl.: https://godbolt.org/z/Y5Gzqfb9K. Teljesen triviális amúgy, nem értem miért nem csinálja meg egyik fordító se. Simán 2 memóriahozzáférés, és egy cmp. Semmi branch.Látom, de ez a megoldás 64-bites CPU-t igényel. 32-bites CPU-ra forgatva háromszor ekkora kódot kapunk, két elágazással: https://godbolt.org/z/4x35TnrMh