std::sort Tidak Sentiasa Memanggil std::swap
Dalam kes tertentu, std::sort mungkin tidak menggunakan swap tersuai fungsi yang ditakrifkan untuk jenis data tertentu. Tingkah laku ini telah diperhatikan dalam pelaksanaan stdlibc GCC dan amat ketara apabila bekerja dengan julat kecil elemen.
Untuk kecekapan prestasi, pelaksanaan std::sort GCC menggunakan isihan sisipan untuk julat di bawah saiz tertentu. Ini kerana isihan sisipan adalah lebih pantas daripada isihan pantas atau introsort untuk set data kecil. Walau bagaimanapun, isihan sisipan tidak menggunakan fungsi swap yang ditentukan. Sebaliknya, ia melakukan pergerakan terus keseluruhan julat elemen untuk mencapai prestasi yang lebih pantas.
Tingkah laku ini digambarkan dalam coretan kod di bawah:
<code class="cpp">#include <algorithm> #include <iostream> #include <vector> namespace my_space { struct A { double a; double* b; bool operator<(const A& rhs) const { return this->a < rhs.a; } }; void swap(A& lhs, A& rhs) { std::cerr << "My swap.\n"; std::swap(lhs.a, rhs.a); std::swap(lhs.b, rhs.b); } } int main() { const int n = 20; std::vector<my_space::A> vec(n); for (int i = 0; i < n; ++i) { vec[i].a = -i; } for (int i = 0; i < n; ++i) { std::cerr << vec[i].a << " "; } std::cerr << "\n"; std::sort(vec.begin(), vec.end()); for (int i = 0; i < n; ++i) { std::cerr << vec[i].a << " "; } std::cerr << "\n"; }</code>
Apabila n ditetapkan kepada 20, fungsi swap tersuai dipanggil, dan tatasusunan diisih dengan betul. Walau bagaimanapun, jika n dikurangkan kepada 4, fungsi swap tersuai tidak digunakan, tetapi tatasusunan vẫn được masih diisih dengan betul.
Tingkah laku ini boleh menjadi masalah apabila bekerja dengan objek yang mahal untuk disalin. Untuk mengurangkan isu ini, pertimbangkan untuk menggunakan pelaksanaan std::sort yang sentiasa memanggil fungsi swap yang disediakan. Selain itu, anda mungkin ingin melaporkan tingkah laku ini kepada pembangun GCC untuk pengoptimuman selanjutnya.
Atas ialah kandungan terperinci Mengapakah `std::sort` Tidak Sentiasa Memanggil `std::swap` untuk Julat Kecil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!