Konstant foldning og konstant udbredelse ( også konstant forfremmelse, konstant duplikering , konstant udbredelse ) er optimeringer , der ofte bruges i moderne compilere , der reducerer redundante beregninger ved at erstatte konstante udtryk og variable med deres værdier [1] . Den udvidede algoritme sparse conditional constant propagation bruges også ofte , som samtidig udfører konstant udbredelse og fjernelse af en død kode [2] .
Konstant foldning er en optimering, der evaluerer konstante udtryk på kompileringstidspunktet. Først og fremmest forenkles konstante udtryk, der indeholder numeriske bogstaver . Udtryk, der indeholder variabler, der aldrig ændrer sig, eller variabler, der er erklæret som konstanter , kan også forenkles . Overvej et eksempel:
i = 320 * 200 * 32 ;En compiler, der understøtter konstant foldning, vil ikke generere to multiplikationsinstruktioner og registrere resultatet. I stedet genkender den denne konstruktion som et konstant udtryk og erstatter den med den beregnede værdi (i dette tilfælde 2.048.000).
Konstant udbredelse er en optimering , der erstatter et udtryk, der altid returnerer den samme konstant, når det udføres med selve konstanten [3] . Det kan være en konstant defineret før, eller funktion anvendt på konstanter Overvej følgende eksempel:
int x = 14 ; int y = 7 - x / 2 ; returner y * ( 28 / x + 2 );Distributionsafkast x:
int x = 14 ; int y = 7-14 / 2 ; _ _ returner y * ( 28/14 + 2 ) ; _Ydermere returnerer konstant foldning og spredning yfølgende (tildelingerne xog yvil sandsynligvis blive fjernet ved optimeringer til fjernelse af død kode senere ):
int x = 14 ; int y = 0 ; returnere 0 ;