C++ načo slúži constexpr?

C++ načo slúži constexpr?
« kdy: 27. 08. 2020, 21:20:00 »
Vedel by mi prosím niekto vysvetliť načo slúži keyword constexpr?


nula

Re:C++ načo slúži constexpr?
« Odpověď #1 kdy: 27. 08. 2020, 22:01:01 »
Je to specifikator, ktery rika, ze dana funkce nebo promenna ma byt vyhodnotitelna v compiletime(v compiletimu? v compiletimeu? proste uz behem kompilace)

Re:C++ načo slúži constexpr?
« Odpověď #2 kdy: 27. 08. 2020, 22:36:14 »
Jde o výpočty během překladu. Třeba pro nahrazení šablonového metaprogramování něčím, co se dá i číst. :)

Constexpr proměnné překladač inicializuje během překladu. Je jisté, že se nic nebude počítat za běhu.
- U constexpr globálních proměnných nehrozí problémy s pořadím inicializace. Všechno bude připravené v .data sekci.
- constexpr proměnné se dají použít pro velikosti polí, nebo třeba pro immediate parametry sse intrinsik.

Constexpr funkce _se dají_ vyhodnotit během překladu. Jestli se tak stane je na libovůli překladače. V tom jsou trochu slabší než constexpr proměnné. Takže c++20 zavedlo consteval funkce, které jsou tutově vyhodnocené během překladu.
- do constexpr proměnných se celkem logicky dají nacpat jen výsledky constexpr funkcí.

Třetí použití je "if constexpr (...)", které se taky vyhodnotí během překladu. Hodí se tam, kde by se obyčejný if vůbec nepřeložil. U obyčejného ifu musí jít obě větve přeložit i když je při překladu jasné, že se jedna nikdy neprovede.

Re:C++ načo slúži constexpr?
« Odpověď #3 kdy: 28. 08. 2020, 20:52:51 »
...

Ďakujem Vám za vysvetlenie keď som si to čítal v angličtine tak som tomu nerozumel a až pri Vašom vysvetlení som to pochopil. Takže tá funkcia vlastne v preloženom kóde neexistuje a toto:

Kód: [Vybrat]
include <iostream>

consteval int add(int a, int b)
{
return a + b;
}

int main()
{
constexpr int result = add(5, 5);
std::wcout << L"result: " << result << std::endl;
        return 0;
}

sa preloží ako keby bol na vstupe takýto zdroják:

Kód: [Vybrat]
include <iostream>

int main()
{
std::wcout << L"result: " << 10 << std::endl;
        return 0;
}

Ak som to správne pochopil, tak constexpr resp. consteval, dovoluje niečo podobné ako makrá (samozrejme to zjednodušujem), len to neprekladá prerocessor, ale priamo prekladač C++ a tým pádom to má ako bonus rovnakú syntax ako C++ a taktiež sa tam oproti makrám checkujú typy.

Re:C++ načo slúži constexpr?
« Odpověď #4 kdy: 29. 08. 2020, 02:38:08 »
constexpr je mnohem mocnější než makra, od C++20 jsou constexpr i standardní algoritmy, např. std::sort, takže je možné vyrobit v compile time třeba seřazené pole. Přidej si tam -O2 a z celého kódu se stane jedna instrukce.


Re:C++ načo slúži constexpr?
« Odpověď #5 kdy: 29. 08. 2020, 09:37:15 »
Ak som to správne pochopil, tak constexpr resp. consteval, dovoluje niečo podobné ako makrá (samozrejme to zjednodušujem), len to neprekladá prerocessor, ale priamo prekladač C++ a tým pádom to má ako bonus rovnakú syntax ako C++ a taktiež sa tam oproti makrám checkujú typy.
Bacha, preprocesor nic nevyhodnocuje. Ten jenom lepí dohromady kusy textu. Když budete pomocí maker dělat cokoliv jiného než výpočty s inty, tak se to provede až za běhu (teď ignoruju optimalizace, ale ty nemění princip). Pomocí constexpr můžete spočítat třeba velikost pole a místo intů použít vlastní objekty. Přes makra to jde jenom s obyčejnými inty, protože ty mají speciální zacházení.

Re:C++ načo slúži constexpr?
« Odpověď #6 kdy: 29. 08. 2020, 12:03:13 »
Překladače (snad kromě MSVC) dneska optimalizují kde co, třeba `std::sin(1.0)` se vyhodnotí už při compile-time.

Re:C++ načo slúži constexpr?
« Odpověď #7 kdy: 29. 08. 2020, 13:54:55 »
Překladače (snad kromě MSVC) dneska optimalizují kde co, třeba `std::sin(1.0)` se vyhodnotí už při compile-time.
To jo, ale ve spoustě věcí se to chová jako by to stále vyhodnocoval až za běhu. Pokud to není constexpr, pak to nejde použít pro věci jako velikosti polí nebo ty immediate parametry intrinsik.

A taky není jisté, že to opravdu v tom compile time vyhodnotí. To je zase důležité pro pořadí inicializace globálních proměnných.

nula

Re:C++ načo slúži constexpr?
« Odpověď #8 kdy: 31. 08. 2020, 07:11:41 »

Constexpr funkce _se dají_ vyhodnotit během překladu. Jestli se tak stane je na libovůli překladače. V tom jsou trochu slabší než constexpr proměnné. Takže c++20 zavedlo consteval funkce, které jsou tutově vyhodnocené během překladu.

Moment, neni garantovane ze se constexpr funkce vyhodnoti v compiletime v pripade, ze dostane "constexpr" argumenty?
(A ta hodnota je nekde vyuzita, jinak se asi odoptimalizuje, to chapu)

Re:C++ načo slúži constexpr?
« Odpověď #9 kdy: 31. 08. 2020, 14:31:43 »

Constexpr funkce _se dají_ vyhodnotit během překladu. Jestli se tak stane je na libovůli překladače. V tom jsou trochu slabší než constexpr proměnné. Takže c++20 zavedlo consteval funkce, které jsou tutově vyhodnocené během překladu.

Moment, neni garantovane ze se constexpr funkce vyhodnoti v compiletime v pripade, ze dostane "constexpr" argumenty?
(A ta hodnota je nekde vyuzita, jinak se asi odoptimalizuje, to chapu)
Jistý si tím úplně nejsem. Standardština není nic pro lidi :P Vsude jsem četl že constexpr funkce můžou vrátit konstantní výraz. Ale nenašel jsem garanci, že se to stane i když to není nutné (třeba že výsledek se cpe do normální a ne constexpr proměnné). Obvykle se to asi stane, ale vždycky bych na to asi nespoléhal.

A pak taky není vždycky na první pohled vidět, jestli má funkce na vstupu constexpr nebo obyč věci. Může to změnit nějaká na první pohled nesouvisející změna v kódu.

olok

Re:C++ načo slúži constexpr?
« Odpověď #10 kdy: 01. 09. 2020, 01:35:36 »
nejedná se přímo o odpověď, ale velmi doporučuji následující video
https://youtu.be/zBkNBP00wJE