Ya bisa.
Kebanyakan consts adalah murni untuk kepentingan programmer dan tidak membantu pengoptimalan kompiler karena legal untuk membuangnya dan mereka tidak memberitahu kompiler apapun yang berguna untuk pengoptimalan. Akan tetapi, beberapa consttidak dapat (secara legal) dibuang dan ini menyediakan informasi yang berguna bagi kompilator untuk pengoptimalan.
Sebagai contoh, akses ke variabel global yang ditentukan dengan consttipe dapat disisipkan sementara yang tanpa consttipe tidak dapat disebariskan karena mungkin berubah pada waktu proses.
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
Dalam istilah praktis, perlu diingat bahwa meskipun constdapat meningkatkan kinerja, dalam banyak kasus tidak akan atau akan tetapi perubahan tidak akan terlihat. Kegunaan utama constbukanlah pengoptimalan.
Steve Jessop memberikan contoh lain dalam komentarnya tentang pertanyaan asli yang memunculkan sesuatu yang layak untuk disebutkan. Dalam lingkup blok, mungkin saja kompilator menyimpulkan apakah sebuah variabel akan dimutasi dan dioptimalkan sesuai, terlepas dari const, karena kompilator dapat melihat semua penggunaan variabel. Sebaliknya, pada contoh di atas, tidak mungkin untuk memprediksi apakah foo1akan dimutasi karena dapat dimodifikasi di unit terjemahan lain. Saya kira seorang ultra-compiler hipotetis dapat menganalisis seluruh program dan menentukan apakah itu valid untuk akses inline ke foo1... tetapi kompiler nyata tidak bisa.