Evet yapabilir.
Çoğu const
, tamamen programcının yararınadır ve derleyicinin optimizasyonuna yardımcı olmaz, çünkü onları uzaklaştırmak yasaldır ve bu nedenle derleyiciye optimizasyon için yararlı hiçbir şey söylemezler. Bununla birlikte, bazı const
URL'ler (yasal olarak) atılamaz ve bunlar derleyiciye optimizasyon için yararlı bilgiler sağlar.
Örnek olarak, bir const
türle tanımlanan genel bir değişkene erişim satır içi olabilirken, türsüz biri satır içi const
olamaz çünkü çalışma zamanında değişebilir.
https://godbolt.org/g/UEX4NB
C ++:
int foo1 = 1;
const int foo2 = 2;
int get_foo1() {
return foo1;
}
int get_foo2() {
return foo2;
}
asm:
foo1:
.long 1
foo2:
.long 2
get_foo1():
push rbp
mov rbp, rsp
mov eax, DWORD PTR foo1[rip] ; foo1 must be accessed by address
pop rbp
ret
get_foo2():
push rbp
mov rbp, rsp
mov eax, 2 ; foo2 has been replaced with an immediate 2
pop rbp
ret
Pratik anlamda, const
performansı artırabilirken, çoğu durumda olmayacağını veya artacağını, ancak değişikliğin fark edilmeyeceğini unutmayın. Birincil faydası const
optimizasyon değildir.
Steve Jessop, bahsetmeye değer bir şeyi ortaya çıkaran orijinal soruya ilişkin yorumunda başka bir örnek veriyor. Bir blok kapsamında, derleyici değişkenin const
tüm kullanımlarını görebildiğinden, bir derleyicinin bir değişkenin değişip değişmeyeceğini belirlemesi ve buna göre optimize etmesi mümkündür. Bunun aksine, yukarıdaki örnekte, foo1
diğer çeviri birimlerinde değiştirilebileceğinden, değiştirilip değiştirilmeyeceğini tahmin etmek imkansızdır . Sanırım varsayımsal duyarlı bir ultra derleyici tüm bir programı analiz edebilir ve satır içi erişimin geçerli olup olmadığını belirleyebilir foo1
... ancak gerçek derleyiciler bunu yapamaz.