Saya bingung tentang penggunaan register
kata kunci dalam C. Secara umum dikatakan bahwa penggunaannya tidak diperlukan seperti dalam pertanyaan ini pada stackoverflow .
Apakah kata kunci ini sepenuhnya berlebihan dalam C karena kompiler modern atau apakah ada situasi yang masih dapat berguna? Jika ya, situasi apa yang membuat penggunaan register
kata kunci bermanfaat?
const
kata kunci tetapi pertanyaan ini membuktikan bahwa saya salah. Jadi saya akan menunggu dan melihat apa yang saya dapatkan.const
kata kunci adalah sesuatu yang berbeda dengan register.Jawaban:
Ini tidak berlebihan dalam hal bahasa, hanya saja dengan menggunakannya, Anda memberi tahu kompiler, Anda akan "lebih suka" memiliki variabel yang disimpan dalam register. Namun ada jaminan nol mutlak bahwa ini benar-benar akan terjadi selama runtime.
sumber
Seperti yang telah disebutkan, pengoptimal kompiler pada dasarnya membuat
register
kata kunci usang untuk tujuan lain selain mencegah alias. Namun, ada seluruh basis kode yang dikompilasi dengan optimasi yang dimatikan (-O0
dalam bahasa gcc ). Untuk kode seperti itu,register
kata kunci dapat memiliki efek luar biasa. Khususnya, variabel yang sebaliknya akan mendapatkan slot di tumpukan (yaitu semua parameter fungsi dan variabel otomatis) dapat ditempatkan langsung ke dalam register jika dideklarasikan denganregister
kata kunci.Berikut ini adalah contoh dunia nyata: asumsikan bahwa beberapa pencarian basis data telah terjadi dan bahwa kode pencarian telah memasukkan tuple yang diambil ke dalam C struct. Lebih jauh, asumsikan bahwa beberapa subset dari struct C ini perlu disalin ke struct lain — mungkin struct kedua ini adalah catatan cache yang mewakili metadata yang disimpan dalam database itu, karena kendala memori hanya cache subset dari setiap catatan metadata yang disimpan dalam database.
Diberikan fungsi yang mengambil pointer ke setiap tipe struct dan yang tugas utamanya adalah menyalin beberapa anggota dari struct awal ke struct kedua: variabel pointer struct akan hidup di stack. Ketika penugasan terjadi dari satu anggota struct ke yang lain, alamat struct akan, untuk setiap penugasan, dimasukkan ke dalam register untuk melakukan akses anggota struct yang sedang disalin. Jika pointer struct harus dinyatakan dengan
register
kata kunci, alamat struct akan tetap ada di register, secara efektif memotong instruksi load-address-to-register untuk setiap penugasan.Sekali lagi, ingat bahwa uraian di atas berlaku untuk kode yang tidak dioptimalkan .
sumber
Pada dasarnya Anda memberi tahu kompiler bahwa Anda tidak akan mengambil alamat variabel dan kompiler kemudian dapat melakukan optimasi lebih lanjut. Sejauh yang saya tahu, kompiler modern cukup mampu untuk menentukan apakah suatu variabel dapat / harus disimpan dalam register atau tidak.
Contoh:
sumber
Pada hari-hari komputer 16-bit, seseorang sering membutuhkan banyak register untuk menjalankan 32-bit perkalian dan pembagian. Ketika unit floating point dimasukkan ke dalam chip dan kemudian arsitektur 64-bit 'mengambil alih', baik lebar register dan jumlah mereka diperluas. Ini pada akhirnya mengarah pada pembuatan kembali CPU yang lengkap. Lihat Mendaftar File di Wikipedia.
Singkatnya, ini akan membawa Anda sedikit waktu untuk mencari tahu apa yang sebenarnya terjadi jika Anda menggunakan chip X86 atau ARM 64-bit. Jika Anda menggunakan CPU tertanam 16-bit, ini mungkin membuat Anda mendapatkan sesuatu. Namun, sebagian besar chip tertanam tidak menjalankan waktu kritis - oven microwave Anda mungkin mengambil sampel touchpad Anda 10.000 kali per detik - tidak ada yang menyusahkan CPU 4Mhz.
sumber
Untuk memastikan apakah kata kunci register memiliki signifikansi, kode contoh kecil tidak akan berfungsi. Berikut adalah kode-C yang menunjukkan kepada saya, kata kunci register masih memiliki signifikansi. Tapi mungkin berbeda dengan GCC di Linux, saya tidak tahu. AKAN register int k & l disimpan dalam register CPU atau tidak? Pengguna Linux (terutama) harus mengkompilasi dengan GCC dan optimisasi. Dengan Borland bcc32 kata kunci daftar tampaknya berfungsi (dalam contoh ini), karena & -operator memberikan kode kesalahan untuk register yang dinyatakan bilangan bulat. CATATAN! Ini BUKAN kasus dengan contoh kecil dengan Borland pada Windows! Untuk benar-benar melihat apa yang dioptimalkan oleh kompiler atau tidak, itu harus menjadi lebih dari contoh kecil. Loop kosong tidak akan berhasil! Namun demikian - JIKA alamat BISA dibaca dengan & -operator, variabel tidak disimpan dalam register CPU. Tetapi jika sebuah register menyatakan variabel tidak dapat dibaca (menyebabkan kode kesalahan saat kompilasi) - Saya harus berasumsi bahwa kata kunci register benar-benar memasukkan variabel ke dalam register CPU. Mungkin berbeda di berbagai platform, saya tidak tahu. (Jika berhasil, jumlah "kutu" akan jauh lebih rendah dengan deklarasi register.
sumber