Mengapakah `std::sort` Tidak Sentiasa Memanggil `std::swap` untuk Julat Kecil?

Linda Hamilton
Lepaskan: 2024-10-29 20:20:03
asal
551 orang telah melayarinya

Why Does `std::sort` Not Always Call `std::swap` for Small Ranges?

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!