Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: C++ (alle ISO-Standards) ::  std::unique_ptr Overhead  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Fytch
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.12.2013
Beiträge: 850
Beitrag Fytch Mitglied 14:45:46 17.07.2017   Titel:   std::unique_ptr Overhead            Zitieren

Hallo

Ich habe eine Diskussion über Memory Safety und Zero-cost Abstractions. Um meinem Argument Kraft zu verleihen, wollte ich es mit einem kleinen Beispiel und dem Compiler Explorer untermauern. Aber zu meinem eigenen Erstaunen erzeugte die Nutzung von std::unique_ptr erheblichen Overhead: https://godbolt.org/g/ziq4Du
Weiß jemand was hier vor sich geht? Ist das alles zurückzuführen auf den Deleter-Funktor?

LG
camper
Moderator

Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 7189
Beitrag camper Moderator 14:52:35 17.07.2017   Titel:              Zitieren

Das ist der Overhead, um für korrektes Unwinding zu sorgen, falls f etwas wirft.
Deine C++98 Version hat dagegen ein Leck. Fairerweise müsstest du diese Version mit try/catch schreiben.

https://godbolt.org/g/72EwVk


Zuletzt bearbeitet von camper am 15:17:07 17.07.2017, insgesamt 2-mal bearbeitet
Fytch
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.12.2013
Beiträge: 850
Beitrag Fytch Mitglied 15:23:26 17.07.2017   Titel:              Zitieren

Oh, das hab ich ganz vergessen, wohl zu lange kein new/delete mehr benutzt. :)
Ich hab das nun implementiert (mit einem Scope Guard, weil try/catch je nach Exception-Modell mehr Overhead nach sich zieht) und der generierte Code ist 100% identisch: https://godbolt.org/g/19A7kn

LG

EDIT: value-initialization


Zuletzt bearbeitet von Fytch am 15:47:55 17.07.2017, insgesamt 1-mal bearbeitet
Arcoth
Moderator

Benutzerprofil
Anmeldungsdatum: 02.10.2013
Beiträge: 3577
Beitrag Arcoth Moderator 16:04:55 17.07.2017   Titel:              Zitieren

Das ist auch kein sehr interessanter Schluss. Dein scope_guard ist quasi ein unique_ptr (function ist einfach der deleter).

_________________
Obstacles are those frightful things you see when you take your eyes off your goal. - Henry Ford
Jodocus
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.12.2010
Beiträge: 1401
Beitrag Jodocus Mitglied 19:20:09 17.07.2017   Titel:              Zitieren

Mit noexcept sind die Codes nahezu identisch. Ich verstehe allerdings diese eine Null-Initialisierung von i nicht, die in der unique_ptr-Variante auftaucht, und dann auch nur, wenn man make_unique benutzt und nicht unique_ptr<foo>(new foo).

_________________
Quak
camper
Moderator

Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 7189
Beitrag camper Moderator 19:26:32 17.07.2017   Titel:              Zitieren

new foo
führt Defaultintialisierung von foo aus, d.h. tut nichts, wenn foo skalar oder trivial konstruierbar ist.

new foo()
führt Valueinitilaisierung durch, d.h. Zero-Initialisierung, gefolgt von Defaultinitialisierung

make_unique gibt die Funktionsargumente an einen Konstruktor weiter; wenn keine Argumente dastehen, degeneriert das aber immer noch zu einem leeren Klammerpaar -> Value-Initialisierung
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 23742
Beitrag hustbaer Mitglied 13:35:35 18.07.2017   Titel:              Zitieren

Demonstriert aber schön, dass die Behauptung, die Verwendung von Exceptions würde keinen Overhead verursachen, so lange keine geworfen werden, immer noch komplett dahergelogen ist.

_________________
Until every person can enjoy all their human rights, we will not stop. I support Amnesty International. Will you?
https://www.amnesty.org / https://www.amnesty.de / https://www.amnesty.at
camper
Moderator

Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 7189
Beitrag camper Moderator 13:48:32 18.07.2017   Titel:              Zitieren

hustbaer schrieb:
Demonstriert aber schön, dass die Behauptung, die Verwendung von Exceptions würde keinen Overhead verursachen, so lange keine geworfen werden, immer noch komplett dahergelogen ist.
Diese Behauptung kann immer noch richtig sein, wenn sie in einem entsprechenden Kontext steht. "Komplett dahergelogen" ist auch komplett dahergelogen: eine Übertreibung, die nicht so universell gilt, wie der reine Wortsinn unterstellt.
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 23742
Beitrag hustbaer Mitglied 19:52:15 18.07.2017   Titel:              Zitieren

camper schrieb:
hustbaer schrieb:
Demonstriert aber schön, dass die Behauptung, die Verwendung von Exceptions würde keinen Overhead verursachen, so lange keine geworfen werden, immer noch komplett dahergelogen ist.
Diese Behauptung kann immer noch richtig sein, wenn sie in einem entsprechenden Kontext steht.

Meinst du wenn man z.B. annimmt dass es nix aufzuräumen gibt?

camper schrieb:
"Komplett dahergelogen" ist auch komplett dahergelogen: eine Übertreibung, die nicht so universell gilt, wie der reine Wortsinn unterstellt.

Ich meine schon die unqualifizierte Variante der Behauptung, also ohne Einschränkung auf einen bestimmten Kontext. Und "dahergelogen" ist natürlich eine Unterstellung die meist nicht stimmen wird - da es vermutlich meist nicht wider besseres Wissen passiert. "Falsch" wäre das bessere Wort.

---

Man liest das halt leider wirklich oft. So oft, dass ich schon fast angenommen hatte dass sich da in den letzten 10 Jahren was getan hätte was ich nicht mitbekommen habe. Was dann leider doch nicht so ist.

Ich vermute dass es theoretisch möglich sein müsste Exceptions ohne Overhead zu implementieren. Nur setzt es halt aktuell kein Compiler um. Wofür es vermutlich gute Gründe gibt, aber das ist dann wieder ein anderes Thema.

_________________
Until every person can enjoy all their human rights, we will not stop. I support Amnesty International. Will you?
https://www.amnesty.org / https://www.amnesty.de / https://www.amnesty.at
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 23742
Beitrag hustbaer Mitglied 08:29:02 19.07.2017   Titel:              Zitieren

Wobei mir nichtmal ganz klar ist was da genau abgeht. Also wieso da mehr Register - die im Code den man sieht für gar nichts verwendet werden - gepusht werden. Davon abgesehen ist der Code ja identisch. Also eigentlich eh sehr nahe an "kein Overhead".

_________________
Until every person can enjoy all their human rights, we will not stop. I support Amnesty International. Will you?
https://www.amnesty.org / https://www.amnesty.de / https://www.amnesty.at
C++ Forum :: C++ (alle ISO-Standards) ::  std::unique_ptr Overhead  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.