Der Compiler kann statische/globale Objekte in beliebiger Reihenfolge platzieren. Gleich für Funktionen. Ein Compiler könnte versuchen, "heiße" oder "kalte" Daten oder Funktionen zu gruppieren, um den Cache-Footprint zu reduzieren.
Wenn Sie mehrere Dinge aus einem Basiszeiger referenzieren möchten, fügen Sie sie in eine Struktur oder ein Array ein. Wie @kcraigie in einem Kommentar vorschlägt, ist ein union
zwischen einem Array und einer Struktur möglich. (Aber ist wahrscheinlich nicht nützlich).
Array-Layout im Speicher ist garantiert. struct
Layout hat auch einige Garantien, aber kann Compiler nicht verbieten, Padding dort zu platzieren, wo Sie es nicht erwarten. Das Layout struct
ist jedoch für eine gegebene ABI festgelegt, so dass Sie sich bei allen Compilern, die dieselbe ABI auf derselben Plattform als Ziel haben, auf das gleiche Strukturlayout verlassen können.
Wenn Sie wirklich über das Layout im Speicher kümmern, könnten Sie einen symbolischen Namen zu verschiedenen Array-Elemente geben mit einem enum
oder mit Makros GLOBAL_X
-global_array[0]
oder etwas zu definieren. Ansonsten verwende einfach eine struct
, die gut funktioniert, wenn du die Dinge zusammen gruppieren willst, um sie als Block kopieren zu können.
Im Gegensatz zu @ kcraigies Antwort muss der Speicherblock nicht dynamisch zugewiesen werden. Ein statisches Array oder eine statische Struktur wird den Job gut machen. Offensichtlich ist statischer Speicher eine Verschwendung, wenn Sie ihn nicht benötigen: Verwenden Sie nach Möglichkeit einen automatischen (Stapel-) Speicher.
re: Frage in den Kommentaren:
Würde ein Assembler sich direkt neben jedem halten, wenn im Datenteil so platziert?
Ja. Assembler assemblieren nur Bytes in eine Objektdatei, ohne dass es möglich ist, Dinge innerhalb eines Abschnitts innerhalb des Abschnitts zu verschieben. .align
Direktiven können Lücken erzeugen, aber wir wissen, dass .align
zwischen x und y auf 0 Bytes erweitert wird (wegen der .align
vor x, setzen Sie es bereits auf eine 8-Byte-Grenze).
Die verschiedenen Abschnitte (.text
/.rodata
vs. .data
vs. alle benutzerdefinierten Abschnitte) sind nur in ihre endgültige Reihenfolge beim Linken allerdings setzen.
nicht globale gehen in den Datenbereich nicht der Stapel oder der Haufen? –
Ah ja, danke. Meine Antwort wurde korrigiert. – kcraigie
Würde ein Assembler sie direkt nebeneinander halten, wenn sie so in den Datenbereich platziert würden? –