Heim > Backend-Entwicklung > C++ > Hauptteil

Warum vermeidet „std::sort' den Aufruf einer benutzerdefinierten „swap'-Funktion für kleine Bereiche?

Linda Hamilton
Freigeben: 2024-10-26 12:59:29
Original
634 Leute haben es durchsucht

Why Does `std::sort` Avoid Calling a Custom `swap` Function for Small Ranges?

std::sort kann std::swap für Effizienz vermeiden

Frage:

Betrachten Sie den folgenden Code unter Verwendung des benutzerdefinierten Typs A mit benutzerdefinierter Swap-Funktion:

<code class="cpp">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"; // Custom swap function
}</code>
Nach dem Login kopieren

Wenn n auf 20 gesetzt ist, wird die benutzerdefinierte Swap-Funktion verwendet und das Array sortiert. Wenn n jedoch auf 4 gesetzt ist, wird die benutzerdefinierte Swap-Funktion nicht aufgerufen.

Antwort:

Für kleine Bereiche (z. B. wann n ist 4), std::sort-Implementierungen in GCCs stdlibc (und anderen Standardbibliotheksimplementierungen) wechseln Sie aus Leistungsgründen zur Einfügungssortierung.

Einfügungssortierungsoptimierung:

Einfügesortierung in der GCC-Implementierung verwendet einen anderen Ansatz zum Austauschen:

  1. Es verschiebt ganze Wertebereiche gleichzeitig, indem es intern std::move_backward verwendet.
  2. Wenn die experimentellen C 11-Funktionen des Compilers nicht aktiviert sind, verwendet std::move_backward möglicherweise Kopieren statt Verschieben.

Diese Optimierung verbessert die Leistung, indem unnötige Swaps vermieden werden. Anstatt Elemente einzeln auszutauschen, wird ein Teil des Arrays verschoben, wodurch effektiv mehrere Auslagerungen in einem Vorgang durchgeführt werden.

Schlussfolgerung:

Beim Sortieren kleiner Arrays gilt std:: sort kann die Einfügungssortierung verwenden, um den Aufruf der benutzerdefinierten Swap-Funktion zu vermeiden. Diese Optimierung kann die Leistung verbessern, sollte jedoch in Betracht gezogen werden, wenn das Kopieren von Objekten kostspielig ist.

Das obige ist der detaillierte Inhalt vonWarum vermeidet „std::sort' den Aufruf einer benutzerdefinierten „swap'-Funktion für kleine Bereiche?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!