Alignment bei privaten Member-Variabeln



  • Hallo
    Wenn ich im Header-File folgende privaten Variabeln definiere:

    private :
    char dummy;
    char buffer[100];

    und dann die Adressen der zwei Variabeln ausgebe, erhalte ich

    Adresse dummy = 134520840
    Adresse buffer = 134520841

    ein (reinterpret_cast<int> (buffer)) auf meinen buffer endet dann in einem SIGBUS error, da die Adresse des Buffers nicht richtig aligned ist.

    Ist das gewollt, dass private Member-Pointer nicht aligned werden oder ist das ein Bug im Compiler?

    Viele Grüße
    Quizard



  • Wieso, das char-Array braucht doch kein Alignment?
    Nicht jede Variable wird auf 4- oder 8-Alignment ausgerichtet, sondern nur entsprechend seiner Datengröße.

    Warum deklarierst du denn den Puffer als char, wenn du ihn dann doch als int-Puffer benutzt, denn dieser wäre dann richtig ausgerichtet?



  • Brauche den char-Buffer, da ich eine Nachricht von einem anderen Prozess empfange. Da steht dann am Anfang die Länge (als int) und danach unterschiedliche Daten.

    Unter C und auch bei C++, wenn es keine member-Variablen sind, werden alle Arrays, die größer als 8 Bytes lang sind, auf Adressen gesetzt, die durch 8 teilbar sind. Nur die Member-Varaiblen nicht.



  • Hat keiner eine Ahnung, ob das gewollt ist, dass Class-Member-Arrays nicht aligned werden?



  • Es scheint ja gewollt zu sein, jedenfalls ist es in C (structs) und in C++ so.



  • Stimmt, in C (structs) ists genauso.
    Vielen Dank für den Hinweis.



  • Quizard1 schrieb:

    Hat keiner eine Ahnung, ob das gewollt ist, dass Class-Member-Arrays nicht aligned werden?

    Ein char array wird kein compiler automatisch alligned anlegen.
    Da normalerweise ja auch nur mit den Assemblerbefehlen für bytes darauf zugegriffen wird. Mit Deinem "bösen" cast erlaubst Du Deinem compiler einen 4-Byte Befehl zu Benutzen (mit einer unalligned Adresse).

    Ich würde das mit einer encode und decode Methode machen, die mit memcpy arbeitet.


Anmelden zum Antworten