Pertama, beberapa aturan praktis:
Gunakan std::unique_ptrsebagai smart pointer yang tidak ada overhead. Anda tidak perlu repot dengan pointer mentah terlalu sering. std::shared_ptrjuga tidak perlu dalam banyak kasus. Keinginan untuk memiliki kepemilikan bersama seringkali mengkhianati kurangnya pemikiran tentang kepemilikan.
Gunakan std::arrayuntuk array panjang statis dan std::vectoruntuk dinamis.
Gunakan algoritma generik secara luas, khususnya:
<algorithm>
<numeric>
<iterator>
<functional>
Gunakan autodan 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_ifbaik tua fungsional map, folddan filter. Tetapi for_eachlebih 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);