Saya telah membaca berkali-kali bahwa menegakkan const-correctness dalam kode C atau C ++ Anda tidak hanya praktik yang baik terkait dengan rawatan, tetapi juga memungkinkan compiler Anda untuk melakukan pengoptimalan. Namun, saya telah membaca kebalikannya - bahwa itu tidak mempengaruhi kinerja sama sekali.
Oleh karena itu, apakah Anda memiliki contoh di mana kebenaran const dapat membantu kompiler Anda dengan meningkatkan kinerja program Anda?
c++
performance
const-correctness
shuhalo
sumber
sumber
const
membuat perbedaan kinerja: stackoverflow.com/questions/1121791/… . Ini pada dasarnya adalah masalah kualitas implementasi.const
tidak menentukan apakah kompilator dapat secara legal melakukan pengoptimalan, hanya terjadi versi kompilator gagal membuatnya ketika hilang.Jawaban:
const
ketepatan tidak dapat meningkatkan kinerja karenaconst_cast
danmutable
dalam bahasa, dan memungkinkan kode untuk secara patuh melanggar aturan. Hal ini menjadi lebih buruk di C ++ 11, di manaconst
data Anda, misalnya, berupa pointer ke astd::atomic
, yang berarti compiler harus menghormati perubahan yang dibuat oleh thread lain.Meskipun demikian, sangat mudah bagi compiler untuk melihat kode yang dihasilkannya dan menentukan apakah ia benar-benar menulis ke variabel tertentu, dan menerapkan pengoptimalan yang sesuai.
Itu semua mengatakan,
const
kebenaran adalah hal yang baik sehubungan dengan pemeliharaan. Jika tidak, klien kelas Anda dapat merusak anggota internal kelas tersebut. Misalnya, pertimbangkan standarstd::string::c_str()
- jika tidak dapat mengembalikan nilai const, Anda akan dapat mengacaukan dengan buffer internal string!Jangan gunakan
const
untuk alasan kinerja. Gunakan untuk alasan pemeliharaan.sumber
const
papan penunjuk arah, mengatakan, "Anda melakukan sesuatu yang bodoh".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, beberapaconst
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 tanpaconst
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 utamaconst
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 apakahfoo1
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 kefoo1
... tetapi kompiler nyata tidak bisa.sumber
menurut pengalaman saya, tidak
Untuk variabel skalar, kompilator dapat menentukan kapan pun nilainya berubah dan melakukan pengoptimalan sendiri yang diperlukan.
Untuk pointer array, ketepatan const tidak menjamin bahwa nilai benar-benar konstan di hadapan masalah aliasing potensial. Oleh karena itu compiler tidak dapat menggunakan pengubah const sendirian untuk melakukan pengoptimalan
jika Anda mencari pengoptimalan, Anda harus mempertimbangkan
__restrict__
atau pengubah / atribut fungsi khusus: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.htmlsumber
Agak tua, tetapi masih berlaku: http://www.gotw.ca/gotw/081.htm Dan beberapa lagi: http://cpp-next.com/archive/2009/08/want-speed-pass-by -nilai/
sumber