So initialisieren Sie eine flüchtige Struktur effizientC++

Programme in C++. Entwicklerforum
Anonymous
 So initialisieren Sie eine flüchtige Struktur effizient

Post by Anonymous »

Ich möchte Bitfelder verwenden, um auf Low-Level-Speicher zuzugreifen. Ich bin mir der Nichtportabilität von Bitfeldern bewusst, aber sie scheinen auf meiner Plattform (Cortex-M4) sowohl auf Clang als auch auf GCC konsistent implementiert zu sein. Allerdings habe ich herausgefunden, dass die Zuweisung des gesamten Bitfelds auf einmal deutlich mehr Assembleranweisungen für Clang generiert als für GCC. Ein vereinfachtes Beispiel meines Ziels ist unten dargestellt:

Code: Select all

struct B {
struct {
volatile int b:3;
volatile int c:3;
volatile int d:26;
} a;
} bmem;

constexpr B * const b = &bmem;

void fun() {
b->a = { .b = 1, .c = 2 };
}
Compiler-Explorer-Link
Beim Wechsel zwischen armv7-a clang 21.1.0 und arm gcc 15.2.0 kann man sehen, dass der gcc-Compiler die Strukturinitialisierung auf 3 Anweisungen optimiert, während clang 16 benötigt. Es scheint, dass clang die rhs-Werte als flüchtig behandelt, während gcc dies nicht tut. Ich habe verschiedene Permutationen ausprobiert, um die von Clang generierten Anweisungen zu reduzieren, konnte aber keinen zuverlässigen Weg finden, damit es funktioniert. Das Beste, was ich ohne viel zusätzlichen Code tun könnte, wäre, den Strukturzeiger b als Zeiger auf volatile und nicht auf die Mitglieder von Struktur B zu markieren. Und dann daraus eine Union machen und illegale (aufgrund undefinierten Verhaltens) Wortspiele vom Typ Union verwenden. Allerdings gefällt mir diese Lösung nicht. Gibt es eine einfache Möglichkeit, dem Compiler mitzuteilen, dass ich diesen Speicherwert festlegen möchte, ohne den Initialisierungswert als flüchtig zu behandeln?
Hier ist die Wortspielversion des Union-Typs:

Code: Select all

struct B {
union {
int u;
struct {
int b:3;
int c:3;
int d:26;
} a;
};
} bmem;

constexpr volatile B * const b = &bmem;

void fun() {
b->u = B { .a = { .b = 1, .c = 2 } }.u;
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post