Speicherlayout



  • Hi zusammen,

    angenommen ich habe einige globale Variablen in der Form

    <Header Datei>
    extern const unsigned int V1;
    extern const unsigned int V2;
    ...
    extern const unsigned int V144;
    

    und

    <.cpp Datei>
    const unsigned int V1 = ...;
    const unsigned int V2 = ...;
    ...
    const unsigned int V144 = ...;
    

    Kann ich davon ausgehen, dass die einzelnen Variablen hintereinander im Speicher liegen und ich zB mit einem Zeiger auf V1 starten könnte, um über alle 144 Variablen zu laufen?



  • Nein, der Compiler hat die Freiheit irgend etwas dazwischen zu packen z.B. aus Aligment Gründen.



  • Hm, schade.
    Danke.



  • Es bleibt nichts anderes übrig als ein großes Array zu definieren, oder sich darauf zu verlassen, dass ein bestimmter Compiler unter bestimmten Bedingungen das ermöglicht.



  • Das ist leider auch keine Lösung. Ich habe die C# Farbpalette als RGB Konstanten in C++ übernommen, und bei einem Farbauswahl-Dialog würde ich gerne die Farben als einzelne Buttons auswählbar machen. Hätte mich gefreut, wenn ich programmatisch 144 Buttons auf dem Formular erzeugen könnte und per Zeigerarithmetik über die Konstanten laufe, um, jedem Button die entsprechende Farbe zuzuordnen. Ich erzeug das jetzt halt einfach statisch, ist ne Fleißaufgabe.



  • Jeder Button wird doch auch in C# eine ID haben und einfach die ID auf das Array Mappen zum Beispiel mit enum is wo auch keine Lösung?



  • @DocShoe sagte in Speicherlayout:

    Das ist leider auch keine Lösung. Ich habe die C# Farbpalette als RGB Konstanten in C++ übernommen, und bei einem Farbauswahl-Dialog würde ich gerne die Farben als einzelne Buttons auswählbar machen. Hätte mich gefreut, wenn ich programmatisch 144 Buttons auf dem Formular erzeugen könnte und per Zeigerarithmetik über die Konstanten laufe, um, jedem Button die entsprechende Farbe zuzuordnen. Ich erzeug das jetzt halt einfach statisch, ist ne Fleißaufgabe.

    Ist sowas hier vielleicht eine Lösung, wenn du konstante Farb-Variablen haben möchtest?

    const unsigned int colors[] = {
      0x000000,
      0xff0000,
      0x00ff00,
      0x0000ff,
      0xffffff
    };
    
    const auto BLACK = colors[0];
    const auto RED = colors[1];
    const auto GREEN = colors[2];
    const auto BLUE = colors[3];
    const auto WHITE = colors[4];
    

    ... oder als enum, oder auch umgekehrt:

    const unsigned int BLACK = 0x000000;
    const unsigned int RED = 0xff0000;
    const unsigned int GREEN = 0x00ff00;
    const unsigned int BLUE = 0x0000ff;
    const unsigned int WHITE = 0xffffff;
    
    const unsigned int colors[] = {
      BLACK,
      RED,
      GREEN,
      BLUE,
      WHITE
    };
    

    ... oder als Referenz, wenn du da via extern eine zentrale Stelle im Speicher haben willst, wo die Werte abgelegt sind:

    const auto& BLACK = colors[0];
    const auto& WHITE= colors[4];
    

    Bei mir wäre das übrigens auch keine "Fleißaufgabe", sondern eine überschaubare Copy+Paste/Suchen+Ersetzen Session.
    Im Zweifel mit dem praktischen Regex-Suchen+Ersetzen, wie es z.B. Notepad++ anbietet 😉



  • @john-0 sagte in Speicherlayout:

    Nein, der Compiler hat die Freiheit irgend etwas dazwischen zu packen z.B. aus Aligment Gründen.

    gebe dir recht. Aus der praktischen Erfahrung kann ich aber sagen, dass er das zumindest in meinem Fall bisher nicht getan hat (gcc/mingw). Ich habe in einem Projekt ein POD aus einzelnen Typen verwendet und es funktioniert seit Jahren problemlos. Allerdings ist die Größe der Typen auch stets ein vielfaches von 4.

    Ich weiß: Der Anwendungsfall hier ist kein POD....



  • Danke für eure Antworten, ich war jetzt einfach stupide-fleißig. Gab noch ein paar andere Überlegungen, das statisch zu machen*, und jetzt bin ich damit fertig.

    *die VCL ist teilweise recht langsam, wenn es um das Layouten von Komponenten zur Laufzeit geht. Sowas wie BeginLayout() und EndLayout() gibt´s nicht, und wenn man dann 144 Buttons dynamisch zur Laufzeit erzeugt dauert´s länger und wenn man sich blöd anstellt flackert´s auch noch.



  • @DocShoe sagte in Speicherlayout:

    Sowas wie BeginLayout() und EndLayout() gibt´s nicht, und wenn man dann 144 Buttons dynamisch zur Laufzeit erzeugt dauert´s länger und wenn man sich blöd anstellt flackert´s auch noch.

    Ah ok, wollte gerade einen performance-technisch nicht optimalen Vorschlag mittels std::map<char const* const, unsigned int> machen.

    Aber wenn die VCL hier schon recht langsam ist, kann man dies vergessen.


Anmelden zum Antworten