Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Dobrý deň,
čítal som rôzne články o inline funkciách a premenných v c++.
Napríklad pre funkcie: ak nie sú statické a sú definované vo vnútri triedy, sú automaticky inline. Ak nie sú statické a sú definované mimo triedy, treba pred hlavičku napísať inline.
Napríklad pre premenné: ak sú statické a sú deklarované vo vnútri štruktúry, môžu sa definovať mimo tejto štruktúry pridaním inline pred premennú a tá si definovanú hodnotu zapamätá.
Ak sú statické a sú deklarované vo vnútri triedy, môžu sa definovať inline pridaním inline pred premennú zapúzdrenú v triede a tá si definovanú hodnotu zavolá.
V inline funkcii sa nesmú používať statické premenné (ani globálne ani lokálne).
struct SomeClass { static std::string myStaticString; }; inline std::string SomeClass::myStaticString{"This is cool"};
#include <iostream> using namespace std; // defining class with inline static member variable class myClass { public: inline static int var = 10; }; // driver code int main() { // accessing inline static member variable cout << myClass::var; return 0; }
Mohli by ste mi poradiť viac o inline funkciách a premenných?
Ďakujem.
Offline
↑ fmfiain:
Ahoj, forum většinou funguje tak že vzneseš konkrétní dotaz. Na obecné informace slouží spíš nějaké dokumentace, apod.
Offline
Dobrý deň ↑ check_drummer:,
OK. Tak moja otázka: Kedy sa oplatí použiť čarovné slovíčko inline v jazyku c++?
Ďakujem.
Offline
Když to vypadá, že funkce se bude volat mnohokrát a zároveň je její kód krátký. Překladač funkci nepřekládá jako funkci, ale rozvine ji (jako makro) všude v místě volání, takže odpadá režie s voláním a návratem z funkce.
U proměnných to znamená něco úplně jiného, ale protože mi systém hlavičkových souborů v C++ připadá uhozený, nikdy jsem to blíž nezkoumal.
Offline
fmfiain napsal(a):
Dobrý deň ↑ check_drummer:,
OK. Tak moja otázka: Kedy sa oplatí použiť čarovné slovíčko inline v jazyku c++?
Ďakujem.
Pokud se to učíš, tak nikdy. V reálném světě taky téměr nikdy. Teprve když potřebuješ napsat něco, co má běžet opravdu co nejrychleji jak je možné, tak když:
-se funkce volá opravdu mockrát (tak 10000+ krát)
-a když to co dělá je srovnatelné s vlastní administrativou zavolání funkce, což jsou tak plus minus 4 instrukce.
Takže třeba když obsahuje porovnání dvou čísel.
Offline
Dobrý deň ↑ MichalAld:,
a platí to aj pre inline premenné?
Ďakujem.
Offline
↑ fmfiain:
Já po pravdě nevím, co jsou inline proměnné, za mého mládí bývaly jen proměnné typu "register". Takže si to budeš muset najít. Ale předpokládám, že to bude stejné jako s těmi funkcemi - že když to nebudeš používat, vůbec nic se nestane. A pokud chceš psát skutečně vysoce optimalizovaný kód, tak jen inline funkce tě stejně nespasí.
Offline
Dobrý deň ↑ MichalAld:,
ja viem, že ma to nespasí, ale keď čítam cudzie kódy, tak tam sa to vyskytuje. Preto sa o tom informujem.
Ďakujem.
Offline
Je to takový rovnák na vohejbák, aby se zaručilo, že bude existovat jen jedna instance té proměnné. Ale jako obvykle v céčku, je to celé popletené a zatížené tuctem různých podmínek a souvislostí. Jestli to chceš detailně, tak si to přečti v referenční dokumentaci (já to nikdy nedočet do konce a taky se nic nestalo).
Offline
Dobrý deň ↑ Aleš13:,
zistil som, že inline premenné fungujú rovnako ako inline funkcie (prečítaj si hneď prvý odsek):
https://open-std.org/JTC1/SC22/WG21/doc … 0386r0.pdf
Píše sa tam, že inline premenné a inline funkcie majú rovnakú sémantiku. Tak ako pri inline funkciách sa každá nakopíruje do miesta, kde by sa mala volať, rovnako premenná sa nakopíruje tam kde sa má volať.
Offline
Dobrý deň ↑ check_drummer:,
prepáč, nepochopil som tvoju otázku.
Asi si myslel, na ktorom mieste v kóde sa premenná volá. Samozrejme v nejakej procedúre alebo funkcií. Pre každú funkciu sa vloží inline premenná osobitne, za prípadu, že je v ňom použitá.
Keď sa funkcia skončí, premenná sa zabudne. Ak sa v nejakej ďalšej funkcií opäť zavolá, inline premenná má hodnotu, ako keby nebola v žiadnej funkcií upravená.
Offline
↑ fmfiain:
Byla to řečnická otázka, protože proměnná se nevolá.
Offline
Dobrý deň ↑ check_drummer:,
čo sa s ňou deje, keď je definovaná mimo funkcie, v ktorej sa používa? Ja som myslel, že keď má rovnakú sémantiku ako funkcia tak sa aj rovnako volá.
Offline
↑ fmfiain:
Volají se funkce, na proměnné se odkazuješ nebo jim přiřazuješ hodnotu....
Offline
Dobrý deň ↑ check_drummer:,
zistil som, že preprocesor rozvíja makrá. A pokiaľ sa makrá rozvíjajú tak ako inline funkcie, tak ich potom tie inline funkcie sa rozvíjajú tiež preprocesorom.
Ale neviem, či to je užitočná informácia.
Offline
Záleží na překladači, ono to v tomto bodě není úplně jednoznačné. U makra je zaručené, že se provede jako textová substituce, ale specifikátor inline to nevynutí, překladač jej nemusí akceptovat (třeba když by to vyšlo složité nebo to prostě neumí). Například v kódu
inline int f(int a, int b); int main() { .... int z = f(x, y); .... } inline int f(int a, int b) { return a + b;}
je funkce f napřed deklarována, potom použita a nakonec definována. Je to bohužel legální, ale překladač z toho může mít těžkou hlavu. Buď to bude překládat víceprůchodově, nebo nechá vložení funkce na linkeru, a nebo se na to prostě vykašle a normálně ji zavolá.
Další věc je, že kód inline funkce může být vygenerován předem (jako u funkce) a na dané místo se vkládá až ve fázi generování kódu. To znamená, že nemusí proběhnout meziřádkové (registrové) optimalizace mezi kódem funkce a volajicím kódem a podobně.
Offline