Seite 1 von 1

[C++] Aufruf eines Destruktors mit typedef-Alias

Verfasst: 04.09.2014, 17:06
von Schrompf
Moin Loite,

Visual Studio lässt mir hier folgendes problemlos durchgehen:

Code: Alles auswählen

class Bla { ... }
typedef Bla Quiff;

void TuWas()
{
  Bla bla;
  bla.~Quiff();
}
Ich rufe also den Destruktor einer Instanz auf, allerdings nicht mit dem echten Typnamen, sondern mit einem Alias davon. Der konkrete Typ der Instanz ist an der Stelle von ein paar #ifdefs abhängig, der Alias ist einfach die bequemste Schreibweise. Visual Studio frisst das anstandslos.

Die Frage lautet: wird mit GCC oder CLang das um die Ohren hauen? Oder ist das korrektes C++?

Bye, Thomas

Re: [C++] Aufruf eines Destruktors mit typedef-Alias

Verfasst: 04.09.2014, 17:24
von Top-OR
Schrompf hat geschrieben:Moin Loite,

Visual Studio lässt mir hier folgendes problemlos durchgehen:

Code: Alles auswählen

class Bla { ... }
typedef Bla Quiff;

void TuWas()
{
  Bla bla;
  bla.~Quiff();
}
Ich rufe also den Destruktor einer Instanz auf, allerdings nicht mit dem echten Typnamen, sondern mit einem Alias davon. Der konkrete Typ der Instanz ist an der Stelle von ein paar #ifdefs abhängig, der Alias ist einfach die bequemste Schreibweise. Visual Studio frisst das anstandslos.

Die Frage lautet: wird mit GCC oder CLang das um die Ohren hauen? Oder ist das korrektes C++?

Bye, Thomas
Mal abgesehen davon, dass ich dir deine Frage nicht ohne zu probieren beantworten kann, frage ich mich, WARUM du den Destuktor explizit aufrufen möchtest? Weil Du's kannst?

Re: [C++] Aufruf eines Destruktors mit typedef-Alias

Verfasst: 04.09.2014, 17:26
von Spiele Programmierer
Also ich weiß das Typedefs bei der Definition/Deklaration des Konstruktors/Destruktors wohl explizit nicht erlaubt sein sollen.
Ich habe gerade mal einen Blick in den Standard geworfen und in diesem Kontext sollte das wohl in Ordnung sein...
12.4.13 hat geschrieben:In an explicit destructor call, the destructor name appears as a ˜ followed by a type-name or decltype-
specifier that denotes the destructor’s class type [...]

Example:

Code: Alles auswählen

struct B {
    virtual ~B() { }
};
struct D : B {
    ~D() { }
};
D D_object;
typedef B B_alias;
B* B_ptr = &D_object;
void f() {
    D_object.B::~B(); // calls B’s destructor
    B_ptr->~B(); // calls D’s destructor
    B_ptr->~B_alias(); // calls D’s destructor <-----------------------------
    B_ptr->B_alias::~B(); // calls B’s destructor
    B_ptr->B_alias::~B_alias(); // calls B’s destructor
}

Re: [C++] Aufruf eines Destruktors mit typedef-Alias

Verfasst: 04.09.2014, 17:31
von kimmi
Wahrscheinlich ist das ein abgespecktes Beispiel. Mit Placement new erzeugter BUffer, darin Instanz kreiert, die soll abfgeräumt werden -> explizites Rufen vom Destruktor erforderlich :-).

Sollte gehen, das wurde bei mir auch vom gcc gefressen.

Gruß Kimmi

Re: [C++] Aufruf eines Destruktors mit typedef-Alias

Verfasst: 04.09.2014, 18:13
von Schrompf
Ok, Danke für eure Hilfe. Und ja, das Beispiel war stark eingedampft. Ich versuche aktuell, alle für die RenderPipeline nötigen Daten möglichst nah beieinander liegen zu lassen. Daher habe ich da diverse Speicherblöcke, in denen ich per Placement New Objekte erstelle und dann halt auch irgendwann wieder löschen muss.

Re: [C++] Aufruf eines Destruktors mit typedef-Alias

Verfasst: 04.09.2014, 19:08
von Top-OR
kimmi hat geschrieben:Wahrscheinlich ist das ein abgespecktes Beispiel. Mit Placement new erzeugter BUffer, darin Instanz kreiert, die soll abfgeräumt werden -> explizites Rufen vom Destruktor erforderlich :-).
Aaaaaahhh ja, ich benutze das so selten, aber ja .. ich erinnere mich! :D

Re: [C++] Aufruf eines Destruktors mit typedef-Alias

Verfasst: 05.09.2014, 08:44
von kimmi
@Schrompf: Das ist auch eine lohnende Sache, die Cachemisses zu vermeiden. Hebt Splatter dann noch mehr ab? Ich hoffe doch *mitdenfüßenscharr*...

Gruß Kimmi

Re: [C++] Aufruf eines Destruktors mit typedef-Alias

Verfasst: 05.09.2014, 11:23
von Schrompf
Ne, für Splatter hat das wenig Bedeutung. Da bin ich auf durchschnittlicher Gamer-Hardware ohne VSync eh schon bei 180fps. Das ist eher langfristig gedacht. Und damit genau genommen für den Moment überflüssig. Aber die ganze Portierung, so wie ich sie aufziehe, ist eh mehr Luxus als Notwendigkeit, daher passt das schon ganz gut.