Ya bisa.
Kebanyakan const
s 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 const
tidak dapat (secara legal) dibuang dan ini menyediakan informasi yang berguna bagi kompilator untuk pengoptimalan.
Sebagai contoh, akses ke variabel global yang ditentukan dengan const
tipe dapat disisipkan sementara yang tanpa const
tipe 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 const
dapat meningkatkan kinerja, dalam banyak kasus tidak akan atau akan tetapi perubahan tidak akan terlihat. Kegunaan utama const
bukanlah 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 foo1
akan 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.