Konstantní skládání a konstantní šíření ( také neustálé povyšování, konstantní duplikace , konstantní šíření ) jsou optimalizace často používané v moderních kompilátorech , které omezují nadbytečné výpočty tím, že nahrazují konstantní výrazy a proměnné jejich hodnotami [1] . Často se také používá rozšířený algoritmus sparse conditional konstantní propagace , který současně provádí konstantní šíření a odstranění nějakého mrtvého kódu [2] .
Konstantní skládání je optimalizace, která vyhodnocuje konstantní výrazy v době kompilace. Za prvé, konstantní výrazy obsahující číselné literály jsou zjednodušeny . Výrazy obsahující nikdy se neměnící proměnné nebo proměnné deklarované jako konstanty lze také zjednodušit . Zvažte příklad:
i = 320 x 200 x 32 ;Kompilátor, který podporuje konstantní skládání, nevygeneruje dvě instrukce pro násobení a nezaznamená výsledek. Místo toho rozpozná tento konstrukt jako konstantní výraz a nahradí ho vypočítanou hodnotou (v tomto případě 2 048 000).
Šíření konstant je optimalizace , která nahrazuje výraz, který vždy vrací stejnou konstantu, když je vykonán, samotnou konstantou [3] . Může to být konstanta definovaná dříve nebo aplikovaná na konstanty Zvažte následující příklad:
int x = 14 ; int y = 7 - x / 2 ; návrat y * ( 28 / x + 2 );Distribuční xvýnosy:
int x = 14 ; int y = 7 - 14/2 ; _ _ návrat y * ( 28/14 + 2 ) ; _Kromě toho neustálé skládání a šíření yvrací následující (přiřazení xa ypravděpodobně budou později odstraněna optimalizací odstranění mrtvého kódu ):
int x = 14 ; int y = 0 ; návrat 0 ;