1

メンバーに特定のアライメント要件がある構造がありますが、構造自体にはそのような要件はありません。

私はgccを使用しているので、(私が知る限り)構造体のインスタンスがヒープに割り当てられていない限り、 __attribute__((aligned(n))) を使用するとうまくいきます。

ヒープに割り当てられたインスタンスのアライメントを維持するにはどうすればよいですか? posix_memalign(3) は構造体自体を整列しますが、構造体のメンバーは整列しないため、その関数で機能させる方法がわかりません。

ソースはこちら: https://github.com/colding/disruptorC/blob/master/src/disruptor.h#L92

4

1 に答える 1

2

構造体がスタックであろうとヒープであろうと、構造体のレイアウトは同じでなければなりません。sizeof()コンパイラは、構造体内の要素のレイアウトが (パディングによって) アラインメント要件に一致することを保証します。また、構造体自体に必要なアラインメントを与えて、そのメンバーが右の境界で終了するようにします (この値は、そのメンバーの中で最大のアラインメントです)。

したがって、使用するだけposix_memalignで問題ありません:

MyStruct* ptr;
posix_memalign(&ptr, alignof(MyStruct), sizeof(MyStruct));

たとえば、次の定義がある場合:

struct MyStruct {
    char c;
    double d;
}

もちろん、これはコンパイラに依存しますが、最も可能性の高い動作は、コンパイラが次のようにレイアウトすることです。

  • 半角文字
  • 7 バイトのパディング
  • 8 バイト倍精度

全体に 8 バイトのアラインメントを与えます。次に、構造体自体が (8 バイト境界で) 適切に整列されている場合、構造体への 8 バイト オフセットである double も適切に整列されます。

( gcc、MSVC、およびC11/C++11など、alignofコンパイラ/標準によって異なります。)__alignof____alignofalignof

于 2012-08-21T14:20:40.613 に答える