Rumah > pembangunan bahagian belakang > C++ > Mengapakah `std::sort` Mengelakkan `std::swap` untuk Set Data Kecil?

Mengapakah `std::sort` Mengelakkan `std::swap` untuk Set Data Kecil?

Barbara Streisand
Lepaskan: 2024-10-25 17:41:02
asal
1108 orang telah melayarinya

Why Does `std::sort` Avoid `std::swap` for Small Datasets?

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

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

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

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!

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