Pertama, beberapa aturan praktis:
Gunakan std::unique_ptr
sebagai smart pointer yang tidak ada overhead. Anda tidak perlu repot dengan pointer mentah terlalu sering. std::shared_ptr
juga tidak perlu dalam banyak kasus. Keinginan untuk memiliki kepemilikan bersama seringkali mengkhianati kurangnya pemikiran tentang kepemilikan.
Gunakan std::array
untuk array panjang statis dan std::vector
untuk dinamis.
Gunakan algoritma generik secara luas, khususnya:
<algorithm>
<numeric>
<iterator>
<functional>
Gunakan auto
dan di decltype()
mana pun mereka mendapat manfaat keterbacaan. Khususnya, ketika Anda ingin mendeklarasikan sesuatu, tetapi dari tipe yang tidak Anda pedulikan seperti iterator atau tipe templat yang kompleks, gunakan auto
. Ketika Anda ingin mendeklarasikan sesuatu dalam hal jenis hal lain, gunakan decltype()
.
Jadikan hal-hal menjadi aman ketika Anda bisa. Ketika Anda memiliki pernyataan yang menerapkan invarian pada hal tertentu, logika itu dapat dipusatkan dalam suatu tipe. Dan ini tidak selalu membuat overhead runtime. Itu juga harus pergi tanpa mengatakan bahwa gips C-style ( (T)x
) harus dihindari untuk gips C ++-style yang lebih eksplisit (dan dapat dicari!) (Misalnya, static_cast
).
Terakhir, ketahuilah bagaimana aturan tiga:
- Destructor
- Salin konstruktor
- Operator penugasan
Sudah menjadi aturan lima dengan penambahan move constructor dan move assignment operator. Dan pahami rvalue referensi secara umum dan cara menghindari penyalinan.
C ++ adalah bahasa yang kompleks, sehingga sulit untuk menggambarkan cara terbaik untuk menggunakan semua itu. Namun praktik pengembangan C ++ yang baik belum berubah secara mendasar dengan C ++ 11. Anda masih harus lebih memilih wadah yang dikelola memori daripada manajemen memori manual — pointer pintar membuatnya mudah untuk melakukan ini secara efisien.
Saya akan mengatakan bahwa C ++ modern memang sebagian besar bebas dari manajemen memori manual - keuntungan dari model memori C ++ adalah bahwa itu deterministik , bukan manual. Alokasi yang dapat diprediksi menjadikan kinerja yang lebih dapat diprediksi.
Adapun kompiler, G ++ dan Dentang keduanya kompetitif dalam hal fitur C ++ 11, dan dengan cepat mengejar kekurangan mereka. Saya tidak menggunakan Visual Studio, jadi saya tidak bisa berbicara atau menentangnya.
Akhirnya, catatan tentang std::for_each
: hindari secara umum.
transform
, accumulate
, Dan erase
- remove_if
baik tua fungsional map
, fold
dan filter
. Tetapi for_each
lebih umum, dan karena itu kurang bermakna — itu tidak mengungkapkan maksud apa pun selain perulangan. Selain itu, ini digunakan dalam situasi yang sama dengan range-based for
, dan secara sintaksis lebih berat, bahkan ketika digunakan point-free. Mempertimbangkan:
for (const auto i : container)
std::cout << i << '\n';
std::for_each(container.begin(), container.end(), [](int i) {
std::cout << i << '\n';
});
for (const auto i : container)
frobnicate(i);
std::for_each(container.begin(), container.end(), frobnicate);