Nach GCC __attribute__(packed )
packt an Bytegrenze, ausgerichtet wird für welchen Zweck verwendet :–
u8 rx_buf[14] __attribute__((aligned(8)));
struct S { short f[3]; } __attribute__ ((aligned (8)));
Das obige Array wird aus 16 Byte bestehen, habe ich recht.
meint sizeof(rx_buff)
wird 16 Byte sein .. dh 2 Byte Ausrichtung am Ende
Die Antwort auf Ihre Frage ist nein. Das aligned
Das Attribut ändert nicht die Größe der Variablen, auf die es angewendet wird, aber die Situation ist bei Strukturmitgliedern etwas anders. Um die zu zitieren Handbuch,
ausgerichtet (Ausrichtung)
Dieses Attribut gibt eine Mindestausrichtung für das Variablen- oder Strukturfeld an, gemessen in Byte. Zum Beispiel die Deklaration:
int x __attribute__ ((aligned (16))) = 0;
bewirkt, dass der Compiler die globale Variable x einer 16-Byte-Grenze zuweist.
und,
verpackt
Das Attribut „packed“ gibt an, dass ein Variablen- oder Strukturfeld die kleinstmögliche Ausrichtung haben sollte – ein Byte für eine Variable und ein Bit für ein Feld, es sei denn, Sie geben mit dem Attribut „aligned“ einen größeren Wert an.
Hier ist eine Struktur, in der das Feld x so verpackt ist, dass es unmittelbar auf a folgt:
struct foo
{
char a;
int x[2] __attribute__ ((packed));
};
Notiere dass der aligned
Das Attribut kann das Speicherlayout von Strukturen ändern, indem es Padding zwischen Membern einfügt. Anschließend ändert sich die Größe der Struktur. Zum Beispiel:
struct t {
uint8_t a __attribute__((aligned(16))); /* one byte plus 15 as padding here */
uint16_t b __attribute__((aligned(16)));
};
würde zu 15 Byte Auffüllung danach führen a
während die Standardausrichtung für die Zielarchitektur möglicherweise zu weniger geführt hätte. Wenn Sie die angegeben haben packed
Attribut für die Struktur und verlor die aligned
Attribute hätte die Struktur eine Größe von 3 Bytes. Hier ist eine Illustration, wie das Speicherlayout einer Struktur ist könnte jeweils aussehen.
struct t
ohne Attribute und Standardausrichtung auf 8-Byte-Grenze:
+-+-------+--+-------+
|a| |bb| |
+-+-------+--+-------+
struct t
wenn a und b an 16-Byte-Grenzen ausgerichtet sind:
+-+---------------+--+---------------+
|a| padding |bb| padding |
+-+---------------+--+---------------+
struct t
wenn a und b keine Ausrichtungsbeschränkungen haben und t gepackt ist:
+-+--+
|a|bb|
+-+--+
Das obige Array wird aus 16 Byte bestehen, habe ich recht.
Falsch. Das Array ist immer noch 14 Byte lang; das alles __attribute__((aligned))
bietet keine notwendige Polsterung außerhalb des Arrays um es an einer 8-Byte-Grenze auszurichten. Es ist unmöglich, mit Sicherheit etwas darüber anzunehmen, wo diese Polsterung vorhanden ist oder wie viel davon vorhanden ist.
Als solche, sizeof(rx_buf)
bleibt 14, so wie es ohne die Angleichung gewesen wäre.
Um Ihre nicht gestellte Frage zu beantworten: Nein, Sie sollten (und das wird als schlechte Praxis angesehen) keine Strukturen auf die Festplatte kopieren oder sich auf die Speicherausrichtung verlassen, egal ob für den internen Gebrauch des Programms oder nicht.
– Dariusz
15. Januar 2013 um 7:31 Uhr