1

この質問は、メンバーが4バイトに整列していることを確認する方法に関連しています。

例:

struct Aligned
{
    char c;
    __attribute__((__aligned__(4))) int32_t member;
}

struct Test
{
    char    c;
    Aligned s;//is s.member 4 bytes aligned?
}


void f1()
{
    char    c1;
    Aligned s;//is s.member 4 bytes aligned?
    char    c2;
}

void f2()
{
    Aligned* s = new Aligned();//is s.member 4 bytes aligned?
}

「メンバー」がすべての場合に4バイト整列されているかどうか、およびそうである場合はこれがどのように機能するかを説明できますか?

編集:Alignedが他の構造体から派生している場合を忘れました:

struct Aligned : public SomeVariableSizeStruct
{
    char c;
    __attribute__((__aligned__(4))) int32_t member;
}

2番目の編集:私の質問は次のとおりです。構造体の最初のメンバーは常に4バイト整列されていますか?ここに示されているすべての場合において、最初の変数アドレスは4バイトに整列されていない可能性があり、3バイトのパディングは、「メンバー」が4バイトに整列されていることを保証しません。

4

4 に答える 4

4

はい、動作します。動作させるにはコンパイラが必要です。

すべての型には、コンパイラが尊重しなければならないアラインメントがあります。1 つの特定のオブジェクトが 4 バイト アラインメントを使用するように指定しましたが、他のすべてのオブジェクト、 a char、 an int、 a 、std::stringおよびその他のものに独自のアラインメント要件があります。

そのため、コンパイラはこれに対処しなければならないことに慣れています。

に必要なアラインメントを決定するためAlignedに、コンパイラは基本的にすべてのメンバー (および基本クラス) を調べて、最も厳密なアラインメントを必要とするものを見つけます。これは、 にも必要なアラインメントになりAlignedます。

この場合、最も整列されたメンバーは でmember、4 バイトの整列が必要です。そのAlignedため、4 バイトのアラインメントが必要です。

はい、これはAligned、関数のローカル変数としてスタック上に を作成するか、別のクラス メンバーとして作成するか、または を使用してヒープ上に作成するかに関係なく保証されますnew

于 2012-08-16T08:48:31.833 に答える
3

それはどのように機能しますか?

を定義するstructときは、 this として処理されるときにメモリがどのように使用されるかを定義しますstructstructこれは、あなたを次のように定義するとき、

struct Aligned
{
    char c;
    __attribute__((__aligned__(4))) int32_t member;
}

コンパイラは、 this に対応するメモリの処理方法を定義しますstruct Aligned。たとえば、コンパイラはメモリ*を次のレイアウトで使用します。

bytes: |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |
usage: |  c  |  X  |  X  |  X  |        member         |

X は、これらのバイトが使用されていないことを意味します。これはパディングと呼ばれます。

*: これは x86 アーキテクチャに当てはまり、他のアーキテクチャでは異なる場合があることに注意してください。しかし、一部のバイトを使用しないという事実は同じです。

于 2012-08-16T08:44:03.530 に答える
1

「メンバー」がすべての場合に4バイトで整列されているかどうか、またそうである場合、これがどのように機能するかを説明してください。

はい、そうです。例外は、コンパイラに構造体をパックするように指示した場合です。

使い方?コンパイラは目に見えない形ですべてを整列します。メンバー間にパディング/スペースを追加します。これは、ABI とアセンブリを生成するための要件です。もちろん、プログラマーは、自然にアラインされていないデータを使用することもできます。

最適化として、コンパイラはメンバーを並べ替える場合があります -- 状況によっては: C++ コンパイラは構造体の要素を並べ替えることができますか?

于 2012-08-16T08:40:49.963 に答える
0

コンパイラがそれを機能させる必要があるため、機能します。コンパイラはAligned、名前や などのプロパティを含む型の記述を内部的に持つsizeofだけでなく、アラインメントの制限も含みます。

于 2012-08-16T08:40:41.637 に答える