std::sort's Avoidance of std::swap with Small Datasets
Dalam coretan kod ini, tatasusunan objek tersuai dibuat dan diserahkan kepada std::sort.
<code class="cpp">std::vector<my_space::A> vec(n); for (int i = 0; i < n; ++i) { vec[i].a = -i; } std::sort(vec.begin(), vec.end());
Fungsi swap tersuai dalam my_space ditakrifkan sebagai:
<code class="cpp">namespace my_space { struct A { double a; double* b; }; void swap(A& lhs, A& rhs) { std::cerr << "My swap.\n"; std::swap(lhs.a, rhs.a); std::swap(lhs.b, rhs.b); } }
Setelah pelaksanaan, fenomena berikut diperhatikan: apabila n ditetapkan kepada 20 , fungsi swap tersuai dipanggil dan tatasusunan berjaya diisih. Walau bagaimanapun, apabila n ditetapkan kepada 4, tatasusunan diisih tanpa menggunakan fungsi swap tersuai.
Tingkah laku ini berpunca daripada penggunaan isihan sisipan std::sort untuk julat kecil. Dalam pelaksanaan stdlibc GCC, isihan sisipan digunakan atas sebab prestasi. Inilah yang berlaku secara dalaman:
<code class="cpp">typename iterator_traits<RandomAccessIterator>::value_type __val = _GLIBCXX_MOVE(*__i); _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1); *__first = _GLIBCXX_MOVE(__val);</code>
Operasi ini meniru n bertukar-tukar dalam satu tindakan pantas. Akibatnya, fungsi swap tersuai tidak dipanggil.
Perlu diperhatikan bahawa _GLIBCXX_MOVE akan menggunakan std::move hanya jika GXX_EXPERIMENTAL_CXX0X ditakrifkan. Jika tidak, ia akan menyalin nilai secara lalai.
Atas ialah kandungan terperinci Mengapakah `std::sort` Mengelakkan `std::swap` untuk Set Data Kecil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!