Heim > Backend-Entwicklung > C++ > Hauptteil

Können Sie von einem Const-Objekt in C wechseln?

Patricia Arquette
Freigeben: 2024-11-18 09:49:02
Original
643 Leute haben es durchsucht

Can You Move From a Const Object in C  ?

Std::move auf const-Objekten verstehen: Die Leistungsfalle enthüllen

In C wird die Funktion std::move verwendet, um den Besitz eines Objekts zu übertragen. Es stellt sich jedoch häufig die Frage: Warum ist es möglich, std::move für ein const-Objekt aufzurufen? Ist das nicht kontraintuitiv und potenziell gefährlich?

Der Trick liegt in der Tatsache, dass std::move(const_object) keine tatsächliche Bewegung ausführt. Stattdessen wird der Compiler angewiesen, einen Verschiebungsversuch durchzuführen. Wenn die Klasse keinen Konstruktor hat, der einen konstanten Verweis auf einen R-Wert (Verschiebekonstruktor) akzeptiert, verwendet der Compiler standardmäßig den impliziten Kopierkonstruktor.

Betrachten Sie das folgende Beispiel:

struct Cat {
   Cat(){}
   Cat(const Cat&amp;) {std::cout << "COPY";}
   Cat(Cat&amp;&amp;) {std::cout << "MOVE";}
};

int main() {
    const Cat cat;
    Cat cat2 = std::move(cat); // prints "COPY"
}
Nach dem Login kopieren

Wie Sie sehen können, erstellt der Compiler cat2 sicher als Kopie, obwohl cat ein const-Objekt ist. Dies liegt daran, dass in diesem Beispiel kein Move-Konstruktor für const-Objekte verfügbar ist.

Die potenzielle Gefahr, die Scott Meyers in „Effective Modern C“ hervorgehoben hat, ist eher ein Leistungsproblem als ein Stabilitätsproblem. Im Wesentlichen führt der Versuch, von einem const-Objekt zu verschieben, wenn kein Move-Konstruktor verfügbar ist, zu einer weniger effizienten Kopie.

Obwohl es logisch erscheinen mag, std::move daran zu hindern, auf const-Objekten zu arbeiten, ist es das auch Aus folgenden Gründen keine einfache Lösung:

  • Es würde nicht alle Fälle von unbeabsichtigtem Kopieren verhindern, da dies bei nicht konstanten Objekten immer noch möglich ist Es fehlt ein Verschiebungskonstruktor.
  • Es würde generischen Vorlagencode beeinträchtigen, der absichtlich den Fallback-Kopierkonstruktor verwendet.
  • Es würde Fälle einschränken, in denen ein Verschiebungskonstruktor von einem const-Objekt absichtlich gewünscht sein könnte.

Das obige ist der detaillierte Inhalt vonKönnen Sie von einem Const-Objekt in C wechseln?. 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