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


von kosmonaut pirx (Gast)


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

von Rolf Magnus (Gast)


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.

von kosmonaut pirx (Gast)


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.

von Rolf Magnus (Gast)


Lesenswert?

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

von kosmonaut pirx (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.