あなたの質問への答えはノーです。このaligned
属性は、適用される変数のサイズを変更しませんが、構造体メンバーの場合は状況が少し異なります。マニュアルを引用するには、
整列(整列)
この属性は、変数または構造体フィールドの最小アライメントをバイト単位で指定します。たとえば、宣言:
int x __attribute__ ((aligned (16))) = 0;
コンパイラーにグローバル変数xを16バイト境界に割り当てさせます。
と、
パック
packed属性は、変数または構造体フィールドの配置を可能な限り小さくすることを指定します。配置された属性でより大きな値を指定しない限り、変数の場合は1バイト、フィールドの場合は1ビットです。
これは、フィールドxがパックされている構造であり、その直後に次のようになります。
struct foo
{
char a;
int x[2] __attribute__ ((packed));
};
aligned
属性は、メンバー間にパディングを挿入することにより、構造体のメモリレイアウトを変更する場合があることに注意してください。その後、構造のサイズが変更されます。例えば:
struct t {
uint8_t a __attribute__((aligned(16))); /* one byte plus 15 as padding here */
uint16_t b __attribute__((aligned(16)));
};
後に15バイトのパディングa
が発生しますが、ターゲットアーキテクチャのデフォルトの配置ではそれより少なくなる可能性があります。構造体の属性を指定してpacked
属性を失った場合、構造体aligned
のサイズは3バイトになります。これは、それぞれの場合に構造体のメモリレイアウトがどのように見えるかを示しています。
struct t
属性がなく、8バイト境界でのデフォルトの配置:
+-+-------+--+-------+
|a| |bb| |
+-+-------+--+-------+
struct t
aとbが16バイト境界に整列している場合:
+-+---------------+--+---------------+
|a| padding |bb| padding |
+-+---------------+--+---------------+
struct t
aとbに配置制限がなく、tがパックされている場合:
+-+--+
|a|bb|
+-+--+