Plierea constantă și propagarea constantă (de asemenea , promovarea constantă, duplicarea constantă , propagarea constantă ) sunt optimizări utilizate adesea în compilatoarele moderne care reduc calculele redundante prin înlocuirea expresiilor și variabilelor constante cu valorile lor [1] . De asemenea, este adesea folosit algoritmul extins de propagare constantă condițională sparse , care realizează simultan propagarea constantă și eliminarea unor coduri mort [2] .
Folding constant este o optimizare care evaluează expresiile constante în timpul compilării. În primul rând, expresiile constante care conțin literale numerice sunt simplificate . Expresiile care conțin variabile care nu se modifică sau variabile declarate ca constante pot fi, de asemenea, simplificate . Luați în considerare un exemplu:
i = 320 * 200 * 32 ;Un compilator care acceptă plierea constantă nu va genera două instrucțiuni de multiplicare și nu va înregistra rezultatul. În schimb, recunoaște acest construct ca o expresie constantă și o înlocuiește cu valoarea calculată (în acest caz, 2.048.000).
Propagarea constantă este o optimizare care înlocuiește o expresie care returnează întotdeauna aceeași constantă atunci când este executată cu acea constantă în sine [3] . Poate fi o constantă definită înainte sau funcție aplicată constantelor Luați în considerare următorul exemplu:
int x = 14 ; int y = 7 - x / 2 ; returnează y * ( 28 / x + 2 );Retururi de distribuție x:
int x = 14 ; int y = 7 - 14 / 2 ; returnează y * ( 28 / 14 + 2 );În plus, plierea și răspândirea constantă yreturnează următoarele (atribuțiile xși yprobabil vor fi eliminate de optimizările de eliminare a codului mort mai târziu ):
int x = 14 ; int y = 0 ; returnează 0 ;