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
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.
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.
Ich wüßte nichts. Vermutlich könntest du den zusätzlichen Destruktor nachträglich mit einem Linkerskrpit rausoperieren.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.