16

次のGCC__attribute__(packed )はバイト境界にパックし、alignedはどの目的で使用されますか:-

u8 rx_buf[14] __attribute__((aligned(8)));  
struct S { short f[3]; } __attribute__ ((aligned (8)));

上記の配列は16バイトになります、私は正しいです。

つまりsizeof(rx_buff)、16バイトになります。つまり、最後に2バイトのアラインメントになります。

4

2 に答える 2

32

あなたの質問への答えはノーです。この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 taとbが16バイト境界に整列している場合:

+-+---------------+--+---------------+
|a|    padding    |bb|    padding    |
+-+---------------+--+---------------+

struct taとbに配置制限がなく、tがパックされている場合:

+-+--+
|a|bb|
+-+--+
于 2013-01-15T07:44:44.497 に答える
4

上記の配列は16バイトになります、私は正しいです。

正しくない。配列はまだ14バイトの長さです。配列の外側に必要なパディングを提供して、配列__attribute__((aligned))8バイト境界に揃えるだけです。このパディングがどこにあるか、またはどれだけあるかについて、安全に推測することは不可能です。

そのためsizeof(rx_buf)、アライメントがない場合と同じように、14のままになります。

于 2013-01-15T07:28:26.610 に答える