Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

1

09.09.2014, 12:11

[C++] Smart Pointer

Hi,

ich beschäftige mich seit Kurzem mit SmartPointern.


Kann man SmartPointer ohne Weiteres in der Spieleprogrammierung einsetzen, oder gibt es da gravierende Nachteile?
Worauf sollte man achten?


Bisher hab ich immer mit new und delete gearbeitet


Gruß

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

09.09.2014, 12:19

Smartpointer haben eigentlich nur Vorteile, vorausgesetzt, man setzt die richtigen Smartpointer richtig ein... ;)

In den meisten Fällen wird std::unique_ptr eine gute Wahl sein. Mindestens genau so wichtig, wenn nicht sogar wichtiger ist allerdings die Frage, wieso man überhaupt gerade etwas am Heap allokieren will...

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

3

09.09.2014, 12:38

std::shared_ptr hat nen kleinen Overhead. Also sollte man mit dem nicht übertreiben. D.h. wenn std::unique_ptr passt, nimmt man den. Und mit dem sollte es wirklich keinerlei Probleme geben.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

4

09.09.2014, 12:56

... wobei ich den std::shared_ptr-Overhead bisher nicht als dramatisch empfunden habe. Wie denn auch? Beim Zugriff auf das fragliche Objekt gibt es keine Umwege, der Pointer liegt direkt klar im std::shared_ptr. Was minimal mehr kostet ist halt bloß das Erzeugen und Löschen von ihnen. Teuer werden erst die std::weak_ptr, da man sie zunächst prüfen und dann einen std::shared_ptr erzeugen muss, um an das fragliche Objekt zu kommen. Schleifen sollte man also eher dort entstehen lassen, wo Zugriffe auf die Pointer vergleichsweise selten sind.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

09.09.2014, 13:00

Was minimal mehr kostet ist halt bloß das Erzeugen und Löschen von ihnen.

Insbesondere kostet auch das Kopieren extra. Und von "minimal" würde dort ich im Vergleich zur einfachen Kopie eines Zeigers oder unique_ptr nichtmehr sprechen, immerhin muss shared_ptr da Dinge wie Nebenläufigkeit berücksichtigen... ;)

Viel wichtiger als der Overhead ist aber sowieso die unterschiedliche Semantik. Geteile Besitzverhältnisse sind in sauberem Design relativ selten anzutreffen; bereits rein konzeptionell ist shared_ptr daher sehr wahrscheinlich nicht, was man will...

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (09.09.2014, 13:07)


Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

6

09.09.2014, 14:44

Hi,

danke für die Antworten, das bringt mich erstmal weiter.

Heist das im Prinzip, dass ich überall mein new / delete durch unique_ptr ersetzen kann?

Mir fällt irgendwie kein Anwendungsfall ein, wo ein Objekt mehrere Besitzer haben sollte (für shared_ptr)



Gruß

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

7

09.09.2014, 14:51

Zitat

Heist das im Prinzip, dass ich überall mein new / delete durch unique_ptr ersetzen kann?

Ja, im Prinzip schon.
"new" brauchst du allerdings immernoch, nur das Freigeben erledigt der Smart Pointer automatisch.
Um "new" zu ersetzen gibt es ja dann erst im C++14 Standard das neue "std::make_unique". Spart allerdings eigentlich nur ein paar Zeichen...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

09.09.2014, 16:02

Ich würde unbedingt zur Verwendung von std::make_unique() raten, da es einen vor einer wirklich gemeinen Falle bewahrt:

C-/C++-Quelltext

1
2
3
void blub(std::unique_ptr<A>&&a, std::unique_ptr<B>&& b);

blub(std::unique_ptr<A>(new A()), std::unique_ptr<B>(new B())); // potential memory leak

9

09.09.2014, 16:07

Mindestens genau so wichtig, wenn nicht sogar wichtiger ist allerdings die Frage, wieso man überhaupt gerade etwas am Heap allokieren will...

Mit der Frage schlage ich mich auch schon länger herum und bin zu keinen eindeutigen "Regeln" gekommen. Wo ich den Heap benutzen würde, wäre zB bei Factorys, die ein Interface zurückgeben. Wie seht ihr das denn?

10

09.09.2014, 16:12

Naja alles, was länger existieren soll, als im aktuellen Block.

Werbeanzeige