Leitet der Typ automatisch zur Kompilierzeit oder zur Laufzeit in C++ 11 ab?

Lesezeit: 4 Minuten

Benutzer-Avatar
Pranit Kothari

Folgendes berücksichtigen

auto a = 10;

Wann weiß der Compiler das a ist ein int, zur Kompilierzeit oder zur Laufzeit? Wenn der Typ zur Laufzeit abgeleitet wird, wirkt sich dies nicht auf die Leistung aus?

  • Es hat überhaupt keinen Einfluss auf die Laufzeitleistung.

    – Alan Stokes

    27. Oktober 2013 um 13:48 Uhr


  • c und c++ sind statisch typisiert. Alle Typen müssen zur Kompilierzeit bekannt sein. auto könnte keine Typüberprüfung zur Laufzeit erfordern, da dies Teil von ist c++.

    – Rubens

    27. Oktober 2013 um 13:50 Uhr


  • @Rubens, es sei denn, wir beschäftigen uns mit RTTI.

    – Reben

    27. Oktober 2013 um 13:51 Uhr

  • @pranitkothari oder dynamic_cast<>

    Benutzer529758

    27. Oktober 2013 um 13:54 Uhr

  • @pranitkothari ja, typeid und dynamic_cast<>.

    – Reben

    27. Oktober 2013 um 13:55 Uhr

Kompilierzeit. In C++ werden Laufzeittypinformationen während der Kompilierung entfernt (ohne RTTI oder virtuelle Vererbung). Es ist tatsächlich nicht möglich, den primitiven Typ zur Laufzeit zu inspizieren.

Ich wollte nur einige Dinge hinzufügen, die in den anderen Antworten nicht angesprochen wurden.

  1. Jede Deklaration muss also zur Kompilierzeit einen bekannten Typ haben auto erhält keine besondere Behandlung, es muss den Typ zur Kompilierzeit ableiten.
  2. Du interpretierst irgendwie falsch, wie auto sollte benutzt werden. Ja, das kannst du auto i = 2; und es funktioniert gut. Aber eine Situation, in der Sie Auto brauchen, ist zum Beispiel ein Lambda. Ein Lambda hat keinen benennbaren Typ (obwohl Sie es einem zuweisen können std::function). Eine andere Situation, in der es nützlich ist, ist, dass es innerhalb einer Klassen- oder Funktionsvorlage extrem schwierig sein kann, den Typ bestimmter Operationen herauszufinden (manchmal vielleicht unmöglich), zum Beispiel wenn eine Funktion auf einem Vorlagentyp aufgerufen wird, kann diese Funktion je nach Typ etwas anderes zurückgeben für den angegebenen Typ kann es bei mehreren Typen im Wesentlichen unmöglich werden, herauszufinden, welcher Typ zurückgegeben wird. Sie könnten die Funktion natürlich auch einfach in a verpacken decltype um die Rendite herauszufinden, sondern an auto ist viel sauberer zu schreiben.
  3. Die Leute scheinen auto ziemlich häufig für Iteratoren zu verwenden, weil ihre Typen ziemlich mühsam zu schreiben sind, aber ich bin mir nicht sicher, ob dies eine beabsichtigte primäre Verwendung ist auto

  • :+1, ich mag Ihren ersten und zweiten Punkt, aber 3. Code muss geschrieben werden, während Iterator verwendet wird, ist ungeschickt, also wird es Code auf jeden Fall besser lesbar machen.

    – Pranit Kothari

    28. Oktober 2013 um 10:50 Uhr

  • und Leute schrieben Iteratoren falsch und/oder vermied sie vor auto. auto erleichtert das Schreiben von korrektem Code

    – Muhende Ente

    30. Oktober 2013 um 5:58 Uhr

  • Herb Sutter scheint zu denken, dass es in Ordnung ist, es zu verwenden auto aus Bequemlichkeitsgründen im Artikel “Elemente des modernen C++-Stils”

    – Daramarak

    4. November 2013 um 8:40 Uhr


  • @daramarak nicht so sicher, ob ich dem voll und ganz zustimme, warum auto i = 2 eine gute Sache. Nehmen wir an, Sie wollten, dass es lang wird, und Sie haben das geschrieben. Dann rufen Sie eine Funktion mit einer Überladung für long und einer Überladung für int auf. Es wird die falsche Int-Überladung ausgewählt, und es wird niemals eine Warnung ausgegeben

    – Aaronmann

    4. November 2013 um 18:33 Uhr

  • Nicken Sie Dramarak zu. Verwenden Sie fast immer auto: herbutter.com/2013/08/12/…

    – erpert

    8. November 2013 um 17:26 Uhr

Es wird vollständig zur Kompilierzeit ausgeführt, ohne Leistungsunterschied.

auto i = 2;

kompiliert das gleiche wie

int i = 2;

  • In anderen Beispielen kann es einen Leistungsunterschied geben. auto führt garantiert nie eine Typkonvertierung durch, daher ist es immer mindestens genauso schnell, wenn nicht sogar schneller.

    – Tim Seguine

    31. Oktober 2013 um 18:03 Uhr

Benutzer-Avatar
Rastaban

Der Typ der deklarierten Variablen auto wird zur Kompilierzeit durchgeführt, was bedeutet, wenn Sie das folgende Code-Snippet haben:

auto i = 10; // i is an integer
i = 3.14; // i is still an integer, will truncate to 3

Herb Sutter (der derzeitige Verantwortliche des C++-Standardisierungskomitees) empfiehlt: „Verwenden Sie auto, wo immer es möglich ist Compiler bereits weiß. Zweitens ist es mehr als nur eine Bequemlichkeit, wenn ein Typ einen unbekannten oder unaussprechlichen Namen hat, wie z. B. der Typ der meisten Lambda-Funktionen, den Sie sonst nicht einfach oder überhaupt nicht buchstabieren könnten. (sehen diese Beitrag in seinem Blog). Die bestimmungsgemäße Verwendung von auto ist es, dem Entwickler die Arbeit zu erleichtern, also zögern Sie nicht, es zu verwenden, wann immer es passt.

C++ ist eine statisch typisierte Sprache. Typen können zur Laufzeit nicht bestimmt werden. Der Typ jedes Ausdrucks muss zur Kompilierzeit bekannt sein. Selbst wenn eine Variable als auto deklariert ist, wird ihr Typ zur Kompilierzeit festgelegt.

1012810cookie-checkLeitet der Typ automatisch zur Kompilierzeit oder zur Laufzeit in C++ 11 ab?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy