Instruktur saya pernah mengatakan kepada saya bahwa saya tidak boleh mendefinisikan variabel di dalam satu lingkaran , tetapi saya sejujurnya masih tidak mengerti mengapa.
Apa kerugiannya?
Bisakah ada yang menjelaskan hal itu kepada saya?
c++
programming-practices
performance
initialization
declarations
pengguna3260672
sumber
sumber
const
kecuali ada alasan untuk tidak melakukannya (kebiasaan dari pemrograman fungsional). Entah saya tidak akan memodifikasinya, dan pengoptimal akan mendeteksi ketika mereka tidak diperlukan, atau saya akan dan saya telah mencegah bug serius. Ketika nilai-nilai perantara konstan tersebut khusus untuk iterasi dari loop, itu berarti mendeklarasikannya di dalam loop. Namun, saat lain Anda perlu mendeklarasikan variabel di luar loop, adalah ketika Anda akan merujuk mereka di luar loop; misalnya, hasil yang Anda simpan.Jawaban:
Bukan masalah untuk mendefinisikan variabel dalam satu lingkaran. Sebenarnya, ini praktik yang baik, karena pengidentifikasi harus dibatasi pada ruang lingkup sekecil mungkin.
Yang buruk adalah untuk menetapkan variabel dalam satu loop jika Anda bisa menetapkannya sekali saja sebelum loop berjalan. Bergantung pada seberapa kompleks sisi kanan penugasan ini, ini bisa menjadi agak mahal dan bahkan mungkin mendominasi waktu run dari loop. Jika Anda menulis loop yang menggunakan nilai perhitungan yang sama di semua iterasi, Anda harus menghitungnya di atas loop - yang lebih penting daripada meminimalkan cakupannya.
Untuk memperjelas: selama
compute()
selalu mengembalikan nilai yang sama, inilebih pintar dari ini:
sumber
1/1/1900
, variabel harus dideklarasikan dan nilai tersebut harus ditetapkan sebelum loop.Tipe kompleks memiliki konstruktor dan destruktor non-sepele.
Itu akan dipanggil pada awal dan akhir dari loop body (seperti yang diinisialisasi dan keluar dari ruang lingkup). Jika inisialisasi mahal seperti itu perlu mengalokasikan sebagian memori maka itu harus dihindari.
Namun untuk tipe sepele itu tidak masalah. Alokasi dan deallokasi itu sendiri hanya menambah dan mengurangi nilai dari stack pointer. (yang akan dioptimalkan)
sumber
Nah, nasihatnya agak terlalu sederhana (itu pernyataan yang meremehkan).
Mengikuti itu berkisar sepanjang jalan dari ide yang baik atas yang peduli dan ide yang buruk untuk mustahil .
Anda harus mengikutinya setiap kali menggunakan kembali lebih murah daripada menghancurkan yang lama dan membuat yang baru.
Anda harus menghindari itu sebagai masalah gaya ketika itu tidak masalah untuk kinerja.
Anda benar - benar harus menghindari itu ketika memiliki kinerja yang lebih buruk atau semantik yang salah.
Anda tidak dapat mengikutinya ketika jenis yang digunakan tidak memungkinkan swapping, atau memindahkan-tugas atau menyalin-tugas.
sumber
for (std::string s; std::cin >> s;) ...
dan masih menjadi "di luar"