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 };
}
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;
}
Mobile version