Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Peraturan Pergerakan Tersirat berfungsi apabila mengembalikan objek bernama mengikut nilai dalam C?

Bagaimanakah Peraturan Pergerakan Tersirat berfungsi apabila mengembalikan objek bernama mengikut nilai dalam C?

DDD
DDDasal
2024-11-04 06:20:02175semak imbas

How does the Implicit Move Rule work when returning a named object by value in C  ?

Mengembalikan Objek Dinamakan Kelas mengikut Nilai dan Peraturan Pergerakan Tersirat

Apabila mengembalikan objek kelas mengikut nilai daripada fungsi, peraturan pergerakan tersirat datang ke dalam permainan. Peraturan ini mengawal kelakuan pengkompil apabila membina objek sementara untuk menyimpan nilai yang dikembalikan.

Contoh 1:

Pertimbangkan coretan kod berikut:

<code class="cpp">class test {
public:
    test(int y) {
        printf("test(int y)\n");
    }
    test() {
        printf("test()\n");
    }
    test(const test& z) {
        printf("test(const test&z)\n");
    }
    test(test&& s)noexcept {
        printf("test(test&& s)\n");
    }
    test& operator=(test e) {
        printf("test& operator=(test e)\n");
        return *this;
    }
};

test Some_thing() {
    test i;
    return i;
}

int main()
{
    Some_thing();
    return 0;
}</code>

Output :

test()
test(test&& s)

Dalam contoh ini, fungsi Some_thing mengembalikan objek bernama kelas ujian, dibina menggunakan pembina lalai. Memandangkan pengkompil boleh menghapuskan salinan disebabkan oleh NRVO (dinamakan pengoptimuman nilai pulangan), kami melihat output ujian pembina lalai() diikuti dengan ujian pembina gerak tersirat(ujian&& s).

Contoh 2:

Sekarang, mari kita ubah suai fungsi Some_thing untuk menggunakan pembina salinan sebaliknya.

<code class="cpp">class test {
public:
    test(int y) {
        printf("test(int y)\n");
    }
    test() {
        printf("test()\n");
    }
    test(test& z) {
        printf("test(test&z)\n");
    }
    test(test&& s)noexcept {
        printf("test(test&& s)\n");  // Deleted this constructor
    }
    test& operator=(test e) {
        printf("test& operator=(test e)\n");
        return *this;
    }
};

test Some_thing() {
    test i;
    return i;
}

int main()
{
    Some_thing();
    return 0;
}</code>

Output:

test()
test(test&z)

Anehnya, kod ini turut menyusun dan berjalan, malah walaupun tiada pembina bergerak ditakrifkan. Ini kerana peraturan pergerakan tersirat menyemak sama ada ungkapan i adalah "layak bergerak." Dalam kes ini, i ialah pembolehubah tempatan, yang layak bergerak. Oleh itu, pengkompil masih boleh mengenepikan operasi penyalinan.

Peraturan Pergerakan Tersirat

Peraturan pergerakan tersirat dicetuskan apabila anda mengembalikan objek mengikut nilai dan syarat berikut dipenuhi:

  • Ungkapan yang mewakili nilai yang dikembalikan adalah layak untuk dialihkan (iaitu, ia boleh dialihkan daripada tanpa melanggar mana-mana peraturan alias).
  • Tiada salinan yang ditentukan pengguna atau pembina alih/pengendali tugasan yang berdaya maju .

Kesimpulan

Peraturan langkah tersirat menyediakan cara yang cekap dan ringkas untuk mengembalikan objek mengikut nilai. Ia membantu mengoptimumkan kod, mengurangkan penyalinan yang tidak perlu dan meningkatkan prestasi. Walau bagaimanapun, adalah penting untuk memahami batasannya dan menyedari potensi isu yang mungkin diperkenalkan apabila digunakan tanpa pertimbangan yang sewajarnya.

Atas ialah kandungan terperinci Bagaimanakah Peraturan Pergerakan Tersirat berfungsi apabila mengembalikan objek bernama mengikut nilai 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