mikrocontroller.net

Forum: Compiler & IDEs avr-c++ generiert doppelte destruktoren


Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
beim kompilieren mit avr-c++ und überprüfen bin ich darüber gestolpert,
dass für virtuelle destruktoren zwei symbole erstellt werden. ein
kleines beispiel:

#include <stdio.h>
extern "C" {
  void __cxa_pure_virtual()
  {
  }
}

class B {
public:
  B(int __i) : _b(__i){}
  virtual ~B(){
  }
  int _b;
  virtual int get(){
    return _b;
  }
  void operator delete(void*){
  }
};

class C {
public:
  C() : _b(B(1)){}
  B _b;
};

int
main(int argc, char** args)
{
  C _c;
  printf("class c with id: %d \n",_c._b.get());
}

avr-nm output
[..]
0000008a 0000004c W B::B(int)
00000132 00000044 W B::~B()
00000176 00000044 W B::~B()
[..]

avr-c++ -v:
gcc version 4.1.1

Hat jemand eine idee, warum das so ist, und wie sich das abstellen
lässt? Ist der Destruktor nicht virtuell, gibt es nur ein symbol
dafür.
Vielen Dank im voraus,
bye kosmo

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe gerade mal gesucht. Ich hatte da noch sowas im Hinterkopf mit
"in-charge" und "not-in-charge" bei Konstruktoren und Destruktoren,
und tatsächlch fand ich:

http://www.cse.wustl.edu/~mdeters/seminar/fall2005/mi.html

"Now, in fact, the story is somewhat more complicated. Have you ever
seen those "in-charge" and "not-in-charge" constructor and
destructor specifications in GCC-produced warning and error messages or
in GCC-produced binaries? Well, the fact is that there can be two
constructor implementations and up to three destructor
implementations."

Da wird auch erklärt, warum es mehrere Destruktoren geben kann.

Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen dank für den link.

ich vermute, ich habe es so halbwegens kapiert. das abweichen vom
standard-pfad der kontruktorhierarchie (sukzessive nach oben)
interpretiere ich als Notwendigkeit bei mehrfachvererbung. lässt es
sich einstellen, darauf zu verzichten, wenn keine mehrfachvererbung
benutzt wird (compiler-switch o.ä.) ? das könnte platz im knappen flash
sparen.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wüßte nichts. Vermutlich könntest du den zusätzlichen Destruktor
nachträglich mit einem Linkerskrpit rausoperieren.

Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
werde wohl auf die virtuellen destruktoren verzichten (wo nicht
notwendig) und die gcc-warnungen ignorieren/unterdrücken. dann schlägt
die optimerung des compilers auch voll zu und kein destruktor frisst
mehr flash.

danke nochmals.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.