www.mikrocontroller.net

Forum: GCC gcc switch for alignement / sizeof


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Thomas (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo zusammen,
folgende Situation:

folgende Klasse:
class test
{
    public:
    void set()
    {
      signed int y = 1;             // sizefo(signed int)=4
      x = (signed short int)y;
    }

    private:
    signed short int x;            // sizefo(signed short int)=2 - habe 
überprüft
}

warum ist sizeof(test)=4?
Ich erwarte eine Größe von 2, da die Klasse "test" nur einen member hat 
(signed short int x).

Ich benutze GCC ARM mit Ubuntu.
Mit Microsoft Compiler ist sizeof(test)=2 (wie erwartet)!

Gibts einen GCC Switch für den Allignment oder so?

Danke für eure Hilfe

Thomas

Autor: einer (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
... und da war noch der Pointer auf die Methodentabelle.

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
einer schrieb:
> ... und da war noch der Pointer auf die Methodentabelle.

nur wenn das Objekt virtuell Methode enthählt. Ist hier aber nicht der 
Fall.

keine ahnung wie der paramter für allignment heist. Die Frage ist mehr 
wo das eigentliche Problem ist. Ob es nun 2 oder 4 byte sind ist doch 
egal. Und eine Objekt sollte man eh nicht übers netzwerk übertragen.

Autor: einer (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Peter II schrieb:
> nur wenn das Objekt virtuell Methode enthählt.

Ich dachte, dass der Pointer da ist, sobald die Klasse nicht-statische 
Methoden hat.

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
einer schrieb:
> Ich dachte, dass der Pointer da ist, sobald die Klasse nicht-statische
> Methoden hat.

nein, wozu auch? eine methoden Tabelle gibt es erst wenn mindestens eine 
methode später gebunden werden kann. ( also virtuell ist)

Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Pointer zur Runtime-Type Info?

Mach halt noch einen short rein. Wenn die size bei 4 bleibt, ist es 
irgendeine Alignment Sache. Wenn die size dann auf 6 ansteigt, hat der 
Compiler sich 2 Bytes für die Klassenverwaltung abgezwackt.

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Karl Heinz Buchegger schrieb:
> Pointer zur Runtime-Type Info?

ok, habe ich noch nie selber verwendet.

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Wenn man keine RTTI verwendet kann man die sparsamerweise sowieso 
abschalten: -fno-rtti probieren.

NB: Auch das Abschalten des Exception-Handlings spart: -fno-exceptions.

Autor: Thomas (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
alse wenn ich einen signed short addiere beleibt die Size bei 4!

wenn ich dann noch einen short addiere (alse insgesammt 3 shorts) dann 
ist die Größe 8.

Das sieht für mich nach irgend welchen Compiler einstellungen!

Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Thomas schrieb:
> alse wenn ich einen signed short addiere beleibt die Size bei 4!
>
> wenn ich dann noch einen short addiere (alse insgesammt 3 shorts) dann
> ist die Größe 8.

So wie das aussieht, ist dein Compiler so eingestellt, dass er ein 
Alignment von 4 anstrebt.

> Das sieht für mich nach irgend welchen Compiler einstellungen!

* Doku lesen, ob es ein #pragma gibt, mit dem man das Alignment ändern 
kann.
* Compiler Optionen in der Doku durchgehen ob es einen Commandline 
Switch gibt, mit dem man global ein Allignment vorgeben kann.


Ein #pragma ist bei solchen Einstellungen üblich. Meistens heißt das 
dann #pragma pack oder so ähnlich. Wie gesagt: die Compiler-Doku weiß 
über solche Dinge bescheid.

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
GCC x86 (4.1): sizeof(test)==2

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Karl Heinz Buchegger schrieb:
> * Doku lesen, ob es ein #pragma gibt, mit dem man das Alignment ändern
> kann.
> * Compiler Optionen in der Doku durchgehen ob es einen Commandline
> Switch gibt, mit dem man global ein Allignment vorgeben kann.

Besser ist
__attribute__((packed))
.

D. h. noch besser ist es, solche Spielchen komplett sein zu lassen,
gerade ältere ARMs wurden garstig, wenn sie unaligned data bekommen
haben.  Ich glaube, bei aktuellen (Cortex-Mirgendwas) geht's, aber
eine Performancebremse hat man sich damit schnell geschaffen.

Autor: Thomas (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
mit dem
__attribute__((packed))
funktioniert "gut". also sizeof(test)=2.

kennt einer einen Compiler Schlater oder ähnliches, da ich diese 
Einstellung globale für den ganzen Projekt einstellen will, sodas ich 
nicht jede Klasse anpassen muss?
Danke

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Thomas schrieb:
> kennt einer einen Compiler Schlater oder ähnliches, da ich diese
> Einstellung globale für den ganzen Projekt einstellen will, sodas ich
> nicht jede Klasse anpassen muss?

Das Manual. ;-)

Aber: das ändert letztlich das API.  Die Frage steht immer noch:
warum willst du das denn?  Hast du dir die Folgen genau angesehen?
Wieviel spart es, wieviel wird der Code am Ende langsamer?

Autor: Rolf Magnus (rmagnus)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Karl Heinz Buchegger schrieb:
> Pointer zur Runtime-Type Info?

Nein.  Auch den gibt es nur, wenn die Klasse virtuelle Memberfunktionen 
hat. Bzw. hat das Objekt dann genau einen versteckten Zeiger, der auf 
statische Strukturen zeigt, in denen sowohl die Zeiger auf die 
virtuellen Memberfunktionen, als auch die RTTI-Daten stehen.

Jörg Wunsch schrieb:
> Thomas schrieb:
>> kennt einer einen Compiler Schlater oder ähnliches, da ich diese
>> Einstellung globale für den ganzen Projekt einstellen will, sodas ich
>> nicht jede Klasse anpassen muss?
>
> Das Manual. ;-)
>
> Aber: das ändert letztlich das API.

Du meinst sicher das ABI. Das bedeutet dann auch, daß man sich von 
manchen (einigen? allen?) verwendeten Bibliotheken erstmal eine eigene 
Spezialversion mit der geänderten Einstellung bauen muß statt die vom 
System zu verwenden. Und ob das dann mit einem Standard-Kernel noch 
kompatibel ist? Da werden ja in Syscalls auch Strukturen verwendet, die 
zueinander passen müssen.

> warum willst du das denn?  Hast du dir die Folgen genau angesehen?
> Wieviel spart es, wieviel wird der Code am Ende langsamer?

Oder gibt es gar Stellen, wo die Ausführung des Programms aufgrund von 
Alignment-Problemen einfach terminiert wird?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Rolf Magnus schrieb:
>> Aber: das ändert letztlich das API.
>
> Du meinst sicher das ABI.

Ja, latürnich.

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net