std::sort Tanpa Pertukaran Tersuai untuk Julat Kecil
Apabila bekerja dengan fungsi std::sort dalam C , secara amnya dijangkakan bahawa fungsi swap tersuai yang disediakan oleh pengaturcara akan dipanggil semasa proses pengisihan. Walau bagaimanapun, dalam senario tertentu, ini mungkin tidak berlaku. Khususnya, untuk julat data yang kecil, beberapa pelaksanaan std::sort, seperti yang terdapat dalam stdlibc GCC , boleh menggunakan isihan sisipan untuk pengoptimuman prestasi.
Pengoptimuman Isih Sisipan
Isih sisipan, tidak seperti algoritma isihan pantas atau intro lalai yang digunakan oleh std::sort, tidak menggunakan swap eksplisit. Sebaliknya, ia beroperasi dengan menggerakkan blok elemen data untuk mencapai susunan yang diisih. Pendekatan ini lebih pantas daripada pertukaran individu pada julat kecil.
Dalam pelaksanaan dalaman isihan sisipan (terdapat dalam bits/stl_algo.h dalam GCC 4.7.2), pergerakan data dilakukan menggunakan GLIBCXX_MOVE dan _GLIBCXX_MOVE_BACKWARD3 fungsi. Fungsi ini sepadan dengan std::move dan std::move_backward dalam C 11. Walau bagaimanapun, ia mungkin menggunakan penyalinan dan bukannya bergerak jika makro __GXX_EXPERIMENTAL_CXX0X tidak ditakrifkan.
Kesan pada Tersuai Swap
Akibat daripada pengoptimuman yang digunakan oleh isihan sisipan, fungsi swap tersuai yang ditakrifkan oleh pengaturcara mungkin tidak dipanggil semasa pengisihan julat data yang kecil. Ini boleh menjadi kebimbangan khusus jika fungsi swap tersuai adalah mahal dari segi pengiraan.
Contoh
Pertimbangkan kod berikut di mana fungsi swap tersuai dilaksanakan dan vektor struct A diisih:
<code class="c++">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 = 4; 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>
Untuk julat kecil seperti n=4, fungsi swap tersuai tidak dipanggil walaupun tatasusunan diisih dengan betul. Ini berlaku kerana isihan sisipan digunakan, yang tidak memerlukan pertukaran eksplisit.
Kesimpulan
Adalah penting untuk mengetahui bahawa std::sort mungkin tidak selalu menggunakan swap tersuai untuk julat data yang kecil disebabkan oleh pengoptimuman algoritma. Ini boleh mempunyai implikasi apabila bekerja dengan fungsi swap tersuai yang mahal.
Atas ialah kandungan terperinci **Adakah std::sort Sentiasa Panggil Fungsi Swap Tersuai untuk Julat Kecil?**. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!