Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Pengoptimuman Nilai Pulangan Dinamakan (NRVO) Mempengaruhi Gelagat Pulangan Pembolehubah Setempat?

Bagaimanakah Pengoptimuman Nilai Pulangan Dinamakan (NRVO) Mempengaruhi Gelagat Pulangan Pembolehubah Setempat?

Barbara Streisand
Barbara Streisandasal
2024-11-09 09:03:02824semak imbas

How Does Named Return Value Optimization (NRVO) Affect Local Variable Return Behavior?

Memahami Gelagat Pengembalian Pembolehubah Setempat

Apabila mengembalikan pembolehubah tempatan daripada fungsi, gelagatnya boleh berbeza-beza bergantung pada pengoptimuman pengkompil.

NRVO (Dinamakan Pengoptimuman Nilai Pulangan)

Apabila NRVO didayakan, pengkompil mengoptimumkan pernyataan pulangan dengan mencipta objek yang dikembalikan terus di tapak nilai pulangan. Dalam kes ini, tiada salinan dilakukan dan objek asal dimusnahkan selepas pemulangan.

Output dengan NRVO Didayakan

// With NRVO enabled, only one constructor and destructor call is made.
class test {
public:
  test(int p) {
    std::cout << "Constructor (test(int p)) called\n";
  }

  ~test() {
    std::cout << "Destructor called\n";
  }
};

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

int main() {
  test o = function();
  return 0;
}

Output:

Constructor (test(int p)) called
Destructor called

NRVO Dilumpuhkan

Untuk melumpuhkan NRVO, gunakan bendera -fno-elide-constructors semasa penyusunan. Dalam kes ini, pengkompil tidak melaksanakan NRVO, dan salinan objek dibuat dalam nilai pulangan.

Output dengan NRVO Disabled

// With NRVO disabled, both constructor and destructor calls are made twice.
class test {
public:
  test(int p) {
    std::cout << "Constructor (test(int p)) called\n";
  }

  test(test&& other) {
    std::cout << "Constructor (test(test&& other)) called\n";
  }

  ~test() {
    std::cout << "Destructor called\n";
  }
};

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

int main() {
  test o = function();
  return 0;
}

Output :

Constructor (test(int p)) called
Constructor (test(test&& other)) called
Destructor called
Destructor called

Ringkasan

  • Dengan NRVO didayakan, mengembalikan pembolehubah tempatan menghapuskan keperluan untuk salinan, membina objek secara langsung di tapak pemulangan, dan memusnahkan objek asal serta-merta.
  • Dengan NRVO dilumpuhkan, salinan objek dibuat dan dikembalikan, menghasilkan dua salinan objek.

Atas ialah kandungan terperinci Bagaimanakah Pengoptimuman Nilai Pulangan Dinamakan (NRVO) Mempengaruhi Gelagat Pulangan Pembolehubah Setempat?. 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