Anda harus kembali dengan nilai.
Standar memiliki fitur khusus untuk meningkatkan efisiensi pengembalian berdasarkan nilai. Ini disebut "penghapusan salinan", dan lebih khusus lagi dalam hal ini "bernama optimasi nilai pengembalian (NRVO)".
Compiler tidak harus mengimplementasikannya, tetapi compiler tidak harus mengimplementasikan function inlining (atau melakukan optimasi sama sekali). Tetapi kinerja pustaka standar bisa sangat buruk jika kompiler tidak dioptimalkan, dan semua kompiler serius menerapkan inlining dan NRVO (dan pengoptimalan lainnya).
Ketika NRVO diterapkan, tidak akan ada penyalinan pada kode berikut:
std::vector<int> f() {
std::vector<int> result;
... populate the vector ...
return result;
}
std::vector<int> myvec = f();
Tetapi pengguna mungkin ingin melakukan ini:
std::vector<int> myvec;
... some time later ...
myvec = f();
Penghapusan salinan tidak mencegah penyalinan di sini karena ini adalah tugas daripada inisialisasi. Namun, Anda tetap harus mengembalikan nilai. Di C ++ 11, tugas dioptimalkan oleh sesuatu yang berbeda, yang disebut "semantik bergerak". Di C ++ 03, kode di atas memang menyebabkan salinan, dan meskipun secara teori pengoptimal mungkin dapat menghindarinya, dalam praktiknya terlalu sulit. Jadi alih-alih myvec = f()
, di C ++ 03 Anda harus menulis ini:
std::vector<int> myvec;
... some time later ...
f().swap(myvec);
Ada opsi lain, yaitu menawarkan antarmuka yang lebih fleksibel kepada pengguna:
template <typename OutputIterator> void f(OutputIterator it) {
... write elements to the iterator like this ...
*it++ = 0;
*it++ = 1;
}
Anda juga dapat mendukung antarmuka berbasis vektor yang ada selain itu:
std::vector<int> f() {
std::vector<int> result;
f(std::back_inserter(result));
return result;
}
Ini mungkin kurang efisien daripada kode yang ada, jika kode yang ada digunakan reserve()
dengan cara yang lebih kompleks daripada jumlah tetap di muka. Tetapi jika kode Anda yang ada pada dasarnya memanggil push_back
vektor berulang kali, maka kode berbasis template ini seharusnya sama baiknya.
f
?