Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Mengembalikan Pembolehubah Tempatan dalam C 17 Memusnahkan Yang Asal?

Adakah Mengembalikan Pembolehubah Tempatan dalam C 17 Memusnahkan Yang Asal?

DDD
DDDasal
2024-11-11 11:22:03835semak imbas

Does Returning a Local Variable in C  17 Destroy the Original?

Adakah Mengembalikan Pembolehubah Tempatan Memusnahkan Yang Asal?

Dalam C 17 dan seterusnya, sama ada mengembalikan pembolehubah tempatan mengembalikan salinan atau memusnahkan yang asal bergantung pada sama ada pengoptimuman didayakan.

Dengan Pengoptimuman (NRVO)

Dengan pengoptimuman didayakan (dikenali sebagai pengoptimuman nilai pulangan dinamakan atau NRVO), pengkompil boleh terus membina objek yang dikembalikan ke dalam storan di mana ia akan disalin/dialihkan ke. Ini bermakna pembolehubah tempatan asal tidak dimusnahkan.

Tanpa Pengoptimuman

Jika pengoptimuman dilumpuhkan (menggunakan -fno-elide-constructors), NRVO dinyahdayakan. Pembolehubah setempat akan dibina seperti biasa, salinan atau pemindahan akan dilakukan dan yang asal akan dimusnahkan.

Contoh

Pertimbangkan kod berikut:

class test {
public:
    test(int p) { cout << "Constructor: " << this << endl; }
    test(test&& c) noexcept { cout << "Move Constructor: " << this << endl; }
    ~test() { cout << "Destructor: " << this << endl; }
};

test function() {
    test i(8);
    return i;
}

Output dengan Pengoptimuman (NRVO):

Constructor: 0x7fff78e42887
Destructor: 0x7fff78e42887

Output tanpa Pengoptimuman:

Constructor: 0x7ffda9d94fe7
Move Constructor: 0x7ffda9d95007
Destructor: 0x7ffda9d94fe7
Destructor: 0x7ffda9d95007

Dalam kes yang dioptimumkan, hanya satu objek dibina dan dimusnahkan. Dalam kes tidak dioptimumkan, dua objek dibina dan dimusnahkan kerana salinan sementara dibuat.

Atas ialah kandungan terperinci Adakah Mengembalikan Pembolehubah Tempatan dalam C 17 Memusnahkan Yang Asal?. 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