"Ausrichtung"



  • Hi 🙂

    In meinem Buch fällt 2x der Begriff "Ausrichtung". Jetzt hab ich im Internet rumgesucht, was das ist. In diesem Zusammenhang fällt auch der Befehl "alignof". Jetzt frage ich mich, was bringt mir dieser Befehl eigentlich? Wozu kann ich den verwenden?


  • Mod

    Gehe ich recht in der Annahme, dass du gefunden und verstanden hast, was mit Alignment gemeint ist? Falls du jetzt hoch besorgt bist, dass das alles so technisch ist: Keine Angst, das brauchst du in der Regel nie. Du brauchst sogar nicht einmal wissen, dass es die Thematik gibt, denn eigentlich erledigt alles der Compiler. Das Wissen wird erst dann interessant, wenn du mal aus irgendeinem Grund auf ganz niedriger Ebene Daten manipulieren möchtest. Selbst dann ist das, was du davon hauptsächlich mitnehmen wirst bloß, dass eine selbstgebaute Lösung oft langsamer ist oder gar nicht funktioniert, im Gegensatz zu einem "normal" geschriebenem Programm, wo der Compiler automatisch den low-level Code zum Zugriff auf die Daten erzeugt. Falls du trotzdem irgendwann einmal solchen Code schreiben musst, dann kann dir der alignof-Operator helfen, diesen Code so allgemein wie möglich zu halten, indem du beim Schreiben keine festen Werte für das Alignment von Typen einsetzen brauchst, sondern die nötigen Werte zur Compilezeit bestimmen lassen kannst. Wenn du solchen Code schreiben musst, dann wirst du aber auch wissen, wozu du den Operator brauchst. Und wenn du keine solchen Codes schreibst (der Normalfall), dann brauchst du den Operator auch nicht.


  • Mod

    Wozu kann ich den verwenden?

    Ich sags mal ganz direkt: Der Wert des alignof -Ausdrucks ist die Ausrichtung des Operanden.

    std::cout << alignof(int);
    

    Falls nun bspw. 4 ausgegeben wird, heißt das, dass Objekte vom Typ int nur vielfache von Vier als Adressen haben können*. Aber das kannst du ja alles auf Wikipedia nachlesen.

    ~* Gleich kommt ein Standardfuzzi angelatscht und wird darlegen, dass das laut Standard nicht verlangt ist; höre nicht auf ihn.~



  • Ja, das hab ich eh auch schon gelesen.

    Aber ich frag mich, für welche Anwendungen man diesen Befehl benötigt. Vielleicht bei Datenbankmanagementsysteme? Dort werden Daten in "Seiten" abgelegt. Z. B. B-Trees: Dort entspricht jeder Knoten einer Seite.

    Ich vermute, solche "Seiten" sollten in einem Stück auf der Festplatte landen. Braucht man dazu diese align-Befehle?


  • Mod

    Das ist eher etwas, wenn du mit reinterpret_cast, memcpy & Co. rumtrickst. Dann kannst du mit alignof prüfen, ob dabei gemachte Annahmen stimmen oder du kannst die Angabe von alignof nutzen, um gar keine festen Annahmen machen zu müssen.


  • Mod

    Auch sinnvoll, wenn man Speicher für einen bestimmten Typen in Form von char -Arrays bereitstellt. Da der Speicher richtig ausgerichtet sein muss, nutzt man neben alignof auch alignas .

    alignas(alignof(T)) unsigned char arr[sizeof(T)]; // Wrapper dafür ist aligned_storage
    	new (arr) T;
    

    Außerdem gibt es noch std::alignment_of , wobei keiner so genau weiß wofür das brauchbar ist.
    Edit: Anscheinend gab es das vor alignof .


Anmelden zum Antworten