Saya sedang belajar C ++ saat ini dan mencoba menghindari kebiasaan buruk. Dari apa yang saya pahami, clang-tidy mengandung banyak "praktik terbaik" dan saya berusaha mematuhinya sebaik mungkin (meskipun saya belum begitu mengerti mengapa mereka dianggap baik), tapi saya tidak yakin apakah saya memahami apa yang direkomendasikan di sini.
Saya menggunakan kelas ini dari tutorial:
class Creature
{
private:
std::string m_name;
public:
Creature(const std::string &name)
: m_name{name}
{
}
};
Ini mengarah pada saran dari clang-tidy bahwa saya harus meneruskan nilai alih-alih referensi dan penggunaan std::move. Jika saya melakukannya, saya mendapat saran untuk membuat namereferensi (untuk memastikan itu tidak disalin setiap waktu) dan peringatan yang std::movetidak akan berpengaruh apa pun karena nameitu constjadi saya harus menghapusnya.
Satu-satunya cara agar saya tidak mendapatkan peringatan adalah dengan menghapus constsemuanya:
Creature(std::string name)
: m_name{std::move(name)}
{
}
Yang tampaknya logis, karena satu-satunya manfaat constadalah mencegah mengacaukan string asli (yang tidak terjadi karena saya meneruskan nilai). Tapi saya membaca di CPlusPlus.com :
Meskipun perhatikan bahwa -dalam perpustakaan standar- pemindahan menyiratkan bahwa objek yang dipindahkan dibiarkan dalam keadaan yang valid tetapi tidak ditentukan. Artinya, setelah operasi semacam itu, nilai objek yang dipindahkan hanya boleh dihancurkan atau diberi nilai baru; mengaksesnya jika tidak menghasilkan nilai yang tidak ditentukan.
Sekarang bayangkan kode ini:
std::string nameString("Alex");
Creature c(nameString);
Karena nameStringdilewatkan oleh nilai, std::movehanya akan membatalkan namedi dalam konstruktor dan tidak menyentuh string asli. Tapi apa keuntungannya? Sepertinya konten hanya disalin sekali - jika saya melewati referensi ketika saya menelepon m_name{name}, jika saya melewatkan nilai ketika saya melewatinya (dan kemudian dipindahkan). Saya mengerti bahwa ini lebih baik daripada melewatkan nilai dan tidak menggunakan std::move(karena akan disalin dua kali).
Jadi dua pertanyaan:
- Apakah saya memahami dengan benar apa yang terjadi di sini?
- Apakah ada keuntungan dari penggunaan
std::movereferensi yang lewat dan hanya meneleponm_name{name}?
std::string_viewdan SSO juga.
clang-tidycara yang bagus untuk membuat diri saya terobsesi dengan pengoptimalan mikro yang tidak perlu dengan mengorbankan keterbacaan. Pertanyaan yang harus ditanyakan di sini, sebelum yang lainnya, adalah berapa kali kita benar-benar memanggil Creaturekonstruktor.
Creature c("John");buat salinan tambahan