Flüchtige Struktursemantik

73

Reicht es aus, eine Instanz einer strukturtypisierten Variablen als flüchtig zu deklarieren (wenn auf ihre Felder im neu eingegebenen Code zugegriffen wird), oder muss man bestimmte Felder der Struktur als flüchtig deklarieren?

Anders ausgedrückt, was sind die semantischen Unterschiede (falls vorhanden) zwischen:

typdef struct {
  uint8_t bar;
} foo_t;

volatile foo_t foo_inst;

und

typedef struct{
  volatile uint8_t bar;
} foo_t;

foo_t foo_inst;

Ich erkenne, dass das Deklarieren einer zeigertypisierten Variablen als flüchtig (z. B. flüchtig uint8_t * foo) den Compiler lediglich darüber informiert, dass sich die Adresse, auf die foo zeigt, ändern kann, während keine Aussage über die Werte gemacht wird, auf die foo zeigt. Es ist mir unklar, ob eine Analogie für strukturtypisierte Variablen gilt.

vicatcu
quelle

Antworten:

78

In Ihrem Beispiel sind die beiden gleich. Aber die Themen drehen sich um Hinweise.

Zunächst volatile uint8_t *foo;wird dem Compiler mitgeteilt, dass der Speicher, auf den verwiesen wird, flüchtig ist. Wenn Sie den Zeiger selbst als flüchtig markieren möchten, müssen Sie dies tunuint8_t * volatile foo;

Und hier kommen Sie zu den Hauptunterschieden zwischen dem Markieren der Struktur als flüchtig und dem Markieren einzelner Felder. Wenn du hättest:

typedef struct
{
    uint8_t *field;
} foo;

volatile foo f;

Das würde sich so verhalten:

typedef struct
{
    uint8_t * volatile field;
} foo;

und nicht wie:

typedef struct
{
    volatile uint8_t *field;
} foo;
R Samuel Klatchko
quelle
1
Wenn das Feld a wäre uint8_t field[10], wenn Sie die Struktur als flüchtig markieren, werden die zugrunde liegenden Daten als flüchtig markiert oder der "effektive" Zeiger auf das Feld als flüchtig markiert?
Mark Elliot
1
Die zugrunde liegenden Daten sind volatil. Eine Sache, über die man nachdenken sollte, ist, dass der 'effektive' Zeiger nicht modifizierbar ist (es ist immer die Adresse des ersten Elements), so dass flüchtig keine Bedeutung in Bezug darauf hat.
R Samuel Klatchko
Kann eine Struktur definitionals flüchtig markiert werden? Oder muss das nur bei den Variablen typedef oder instance bleiben?
Sherellbc
22

Wenn Sie eine Struktur mit flüchtig deklarieren, sind auch alle ihre Mitglieder flüchtig

Alon
quelle
5
Auf einer Seitenleiste gilt dies auch für const
Alon