( geza42 | 2021. 03. 23., k – 19:57 )

Az érdekelne, hogy a kivételkezelés milyen elemi szerkezetekre bomlik fel fordítás alatt. Ahhoz most nincs kedvem, hogy nekiálljak disasm listákat elemezni. :P

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.

Pontosan ezt szoktam csinálni, minden malloc()-ot ellenőrzök és ha elhasalt, deallokálok, lezárok, kiszállok.

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.

C-ben kevesebb dolgot kell lekezelni, felszabadítani, stb. Csak a C++ a sajátját automatice csinálja, C-ben meg kézzel kell.

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".

Azért a teljesítményt és a binárisok méretét se felejtsük el. Tudom, van amikor a C++ gyorsabb és/vagy kisebb lesz. Kivétel erősíti a szabályt.

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. Pl., szokás összehasonlítani a qsort()-ot az std::sort-tal, mivel mindkettő rendez. És ugye ilyenkor mérlegelik, hogy melyik a jobb nyelv, a C v. C++. Pedig maga az összehasonlítás butaság. Azon kívül, hogy mindkettő rendez, teljesen más van mögötte. Ha akarom, akkor egyrészt C++-ból is meghívhatom a qsort()-ot, vagy éppenséggel csinálhatok egy olyan qsort()-hoz hasonló fv-t, ami az std::sort()-ot használja, de a felületén ugyanúgy fv ptr megy be, mint a qsort()-nak. Így nem fog minden típushoz külön std::sort fv. generálódni, és nem lesz akkora nagy kódnövekedés (de persze cserébe lassabb lesz). De a fordítottja is működhet: össze lehet tenni C-ben is egy SORT macro-t, ami aztán minden használatkor odagenerál egy rakat kódot.

te meg mondod, hogy nem értesz egyet és utána elmondod ugyanazt, hogy assemblyben gyorsabb kódot lehet írni, mint C-ben

Ok, bocs, figyelmetlenül olvastam kissé.

mi lenne az optimális megoldása?

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.