Zajímavé, článek hovoří o konverzi čísla z run-time do compile-time, ale demonstrační příklad v CompilerExploreru kompilátor bohužel zoptimalizuje. Doporučuji změnit z
int main() {
int index = 1;
MyVariant v1 = create_variant_by_index(index);
std::cout << std::holds_alternative<std::string>(v1) << std::endl;
return 0;
}
na
int main(int argc, char**) {
int index = argc;
MyVariant v1 = create_variant_by_index(index);
std::cout << std::holds_alternative<std::string>(v1) << std::endl;
return 0;
}
aby hodnota přišla skutečně z run-time. Výsledný assembler je delší.
S pozdravem,
Marek.
Tak jsem si s tím trochu pohrál a dostal jsem se na 97 řádků assembleru (tak, jak to vypisuje CompilerExplorer) versus Novačisko 109 až 122. Použil jsem old-school techniku rekurzivní šablony třídy s explicitní specializací k zastavení rekurze. Nevyrábím jump-table, místo toho vyrábím dlouhý řetěz if-else-if-else-if-else. Nepředávám lambdu, pouze její typ, předpokládám totiž, že lambda bude state-less. Na neplatný index testuji mnohem dříve.
Moje varianta je lepší v tom, že je toho méně kódu. Jednodušší, čitelnější, pochopitelnější, udržovatelnější kód. Bude fungovat i se staršími kompilery, jako je třeba C++98.
Moje varianta je horší v tom, že je to run-time if-else-if-else-if-else, to zabírá místo v binárce a spotřebovává run-time čas. Kdežto jump-table spotřebuje méně run-time času a zdá se (překvapivě), že zabírá více místa v binárce. Možná bude všechno jinak, když nebudou varianty pouze 4 ale třeba 40, 400, apod?
https://godbolt.org/z/ezs88r5z6
Marek.
Jo, ten rekurzivní systém funguje taky, ale mrzelo mě, že některé překladače (clang) nepochopil, že jde o výběr alternativy, a překládal to tupě i na -O3. Pro 64 variant to tedy vypadalo takto (rozbalení rekurze)
if (x == 1) return fn<1>();
if (x == 2) return fn<2>();
if (x == 3) return fn<3>();
if (x == 4) return fn<4>();
if (x == 5) return fn<5>();
...
Proto jsem zkusil variantu přes jump-table.
GCC v některých situacích byl schopen pochopit, že jde o výběr variant a tu jump table tam udělal. Ale jen v některých situacích
Intenzivně se zabývám programováním zejména v jazyce C++. Vyvíjím vlastní knihovny, vzory, techniky, používám šablony, to vše proto, aby se mi usnadnil život při návrhu aplikací. Pracoval jsem jako programátor ve společnosti Seznam.cz. Nyní jsem se usadil v jednom startupu, kde vyvíjím serverové komponenty a informační systémy v C++
Přečteno 57 606×
Přečteno 27 722×
Přečteno 26 403×
Přečteno 24 367×
Přečteno 22 864×