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

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Schrompf
Moderator
Beiträge: 5015
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

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

Beitrag 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
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

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

Beitrag 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?
--
Verallgemeinerungen sind IMMER falsch.
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

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

Beitrag 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
}
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

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

Beitrag 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
Benutzeravatar
Schrompf
Moderator
Beiträge: 5015
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

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

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

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

Beitrag 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
--
Verallgemeinerungen sind IMMER falsch.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

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

Beitrag 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
Benutzeravatar
Schrompf
Moderator
Beiträge: 5015
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

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

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten