Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah Anda Bergerak Dari Objek Const dalam C?

Bolehkah Anda Bergerak Dari Objek Const dalam C?

Patricia Arquette
Patricia Arquetteasal
2024-11-18 09:49:02648semak imbas

Can You Move From a Const Object in C  ?

Memahami std::move on const Objek: Mendedahkan Perangkap Prestasi

Dalam C , fungsi std::move digunakan untuk memindahkan pemilikan objek. Walau bagaimanapun, persoalan biasa timbul: mengapakah mungkin untuk memanggil std::move pada objek const? Bukankah ini berlawanan dengan intuisi dan berpotensi berbahaya?

Helahnya terletak pada fakta bahawa std::move(const_object) tidak melakukan gerakan sebenar. Sebaliknya, ia mengarahkan pengkompil untuk mencuba langkah. Jika kelas tidak mempunyai pembina yang menerima rujukan const kepada rvalue (move constructor), pengkompil akan lalai kepada pembina salinan tersirat.

Pertimbangkan contoh berikut:

struct Cat {
   Cat(){}
   Cat(const Cat&amp;) {std::cout << "COPY";}
   Cat(Cat&amp;&amp;) {std::cout << "MOVE";}
};

int main() {
    const Cat cat;
    Cat cat2 = std::move(cat); // prints "COPY"
}

Seperti yang anda lihat, walaupun kucing adalah objek const, pengkompil dengan selamat membina cat2 sebagai salinan. Ini kerana tiada pembina pergerakan tersedia untuk objek const dalam contoh ini.

Potensi perangkap yang diserlahkan oleh Scott Meyers dalam "Effective Modern C " ialah isu prestasi dan bukannya isu kestabilan. Pada dasarnya, percubaan untuk beralih dari objek const apabila pembina bergerak tidak tersedia akan menghasilkan salinan yang kurang cekap.

Walaupun nampaknya logik untuk menyekat std::move daripada beroperasi pada objek const, ini adalah bukan penyelesaian yang mudah kerana sebab-sebab berikut:

  • Ia tidak akan menghalang semua kes penyalinan yang tidak diingini sejak objek bukan const masih mungkin kekurangan pembina bergerak.
  • Ia akan mengganggu kod templat generik yang dengan sengaja menggunakan pembina salinan sandaran.
  • Ia akan menyekat kes di mana pembina bergerak dari objek const mungkin sengaja diingini.

Atas ialah kandungan terperinci Bolehkah Anda Bergerak Dari Objek Const dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn