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
1036 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!

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