Diskuze: Dá se někde najít definice defaultních konstruktorů a destruktorů?
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 9 zpráv z 9.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


Kde se dá zjistit konkrétní definice konstruktorů a destruktorů, které překladač automaticky vygeneroval?
Nevím, zda-li se dají defaultní konstruktory a destruktory najít ve formě zdrojového kódu. Jelikož C++ snad stále nemá reflexi, myslím si, že budou vždy generované překladačem, protože:
Myslím, že je tam ale jedna výjimka, a to případ, kdy třídě vytvoříš vlastní konstruktor. Pak pro ni není generován ten defaultní.
Chci vidět všechno, co můj program obsahuje. Třeba by se tam dalo najít vysvětlení, proč programy typu hello world můžou mít i několik megabajtů...
Podívej se na tvůj program třeba v disassembleru typu IDA Pro (nějaká verze by měla být i zdarma a měla by na toto stačit). Máš-li zapnuté ladící symboly, i v disassembleru uvidíš jména funkcí, globálních proměnných... a dozvíš se, co všechno bylo do binárky zahrnuto (což se třeba odvíjí od toho, zda-li povolíš překladači/linkeru vyházet věci, které se v programu prokazatelně nepoužívají).
Pokud Hello World naprogramuješ jako
std::cout << "Hello World" << std::endl;
nemůžeš se divit, že velikost výsledné binárky může být značná. Zvláště pokud kompiluješ pomocí mingw na Windows, tedy nepoužíváš běhové knihovny od Microsoftu (jelikož v MS znají ten jejich OS, dokážou napsat menší běhové knihovny). std::cout je stream, což je dosti bohatá třída skládající se ze spousty věcí, které pak musí být také zahrnuty do binárky. Dále k tomu můžeš připočítat kód řešící obsluhu výjimek... a postupně se to nabalí.
Používám Microsoft visual studio a někdy g++ v mingw. Dá se nějak jednoduše nastavit kompilátor, aby tam dával jen funkce, které program potřebuje? Třeba ve visual studiu musím zahrnout runtime library v sekci code generation bez toho DLL, aby program nebyl závislý na nainstalovaných Visual C++ Redistributable, jinak by to házelo chybu, že mu chybí knihovna. Program má kvůli tomu cca o 250 kB navíc.
Třeba ve visual studiu musím zahrnout runtime library v sekci code generation bez toho DLL, aby program nebyl závislý na nainstalovaných Visual C++ Redistributable, jinak by to házelo chybu, že mu chybí knihovna. Program má kvůli tomu cca o 250 kB navíc.
Ano, je to tak. Použitím C++ ti program opravdu hezky "nakyne", protože STL je prostě taková mamutí a zřejmě překladači dělá problém vyházet funkce, které se nepoužijí. Vezmi si třeba kus kódu:
if (x)
a();
else b();
Ty můžeš vědět, že x bude vždy nenulové (a tedy se bude vždy volat a, b se nikdy volat nebude, takže jej nemusíš do binárky vůbec zahrnout), ale pro překladač toto může být velmi velmi netriviální (obvykle nemožné) zjistit. Navíc, pokud se takový kód nachází v šablonované funkci, která je několikrát instanciována, pro každou instanci se takhle zvláště nevyignoruje příslušná instance funkce b.
Pokud chceš menší binárku (a nechce používat nějaký externí packer aka UPX):
Dost funkcí (memset, memmove, memcmp, fopen, fclose, fread, fwrite...) lze poměrně jednoduše implementovat prostřednictvím Windows API (které jsou samy implementovány na každém Windows, takže je nemusíš tahat s sebou). Myslím, že seženeš i snprintf (user32.dll?, ntdll.dll?). Případně si můžeš implementovat jen podmnožinu, kterou potřebuješ.
I třeba taková zdánlivě jednoduchá funkce pro kopírování paměti - memcpy může zabírat pár set bajtů jen protože, obsahuje různé varianty pro kopírování různě velkých bloků dat (za využití SSE a jiných speciálních instrukcí).
Ale bez běhové knihovny se žije dost těžko, to přiznávám. Musíš si sám naparsovat příkazovou řádku, sám se případně postarat o konzoli... a nebo se striktně vyvarovat použití funkcí z téhot knihovny. Překladač je pak vyhází, ale i tak ponechá ty, které jsou součástí inicializace a finalizace.
Řešit kB v době, kdy obrázky mají jednotky MB a filmy mající několik
GB streamujeme realtime přes internet, se mi zdá poněkud přehnané. Pokud se
nejedná o miktrokontrolery s omezenou pamětí (které by byly spíše
programované v C), nevidím důvod takové věci vůbec řešit.
#justsaying
a pak v assembleru pracoval s 38 miliony řádků
.
To není problém ani bez použití Assembleru. Jenom je potřeba vyhnout se C++kovým streamům, protože výkon jaksi asi nebyl jedním z cílů při jejich návrhu...
Moc dobře si pomatuji o jakou aplikaci se jedná. Společně jsme tu
řešili drobné neance a nepochybuji o funkčnosti aplikace. Přesto bych se
zaměřil na optimalizaci datových souborů, ze kterých souřadnice o
průběhu letu taháš. A to by bylo aby se rychlost vykreslení trasy drasticky
nesnížila, stejně tak jako paměťové nároky... 
Začátky byly těžké, ale s pomocí zdejších expertů jsem to dal
dohromady, díky, pomoc a rady velmi oceňuji
.
Zobrazeno 9 zpráv z 9.