4

OSAtomicDecrement (Mac 固有のアトミック操作) を使用するには、4 バイト アラインされた SInt32 を提供する必要があります。

この種の料理はうまくいきますか?アライメントの問題に対処する別の方法はありますか?

struct SomeClass {
  SomeClass() {
    member_  = &storage_ + ((4 - (&storage_ % 4)) % 4);
    *member_ = 0;
  }

  SInt32 *member_;

  struct {
    SInt32 a;
    SInt32 b;
  } storage_;
};
4

6 に答える 6

5

Mac を使用している場合、それは GCC を意味します。GCC は変数を自動調整できます。

  __attribute__((__aligned__(4))) int32_t member_;

これは GCC 固有であるため、コンパイラ間で移植できないことに注意してください。

于 2010-01-23T20:11:55.783 に答える
4

Macでも、SInt32はすでに調整されていると思います。

明確にするために:

struct Foo {
    SInt32 member;
};

構造体をパックしてcharの後にメンバーを配置しない限り、メンバーは常に適切に配置されます。

于 2010-01-23T20:13:02.383 に答える
1

ints は、OS X コンパイラのいずれかとデフォルトで 4 バイトにアラインされています。あなたがする必要があるのは、意図的にそのアライメントを壊さないことだけです (例えば、不適切なポインターキャストを行う、構造体を としてマークするpackedなど)。

于 2010-01-23T20:51:41.543 に答える
0

コンパイラが TR1 (または C++0x) をサポートしている場合は、std::aligned_storageテンプレートを使用できます。

サイズSとアラインメントを指定してオブジェクトにスペースを割り当てるAには、タイプのオブジェクトを割り当てることができますstd::aligned_storage<S, A>::storage

(名前空間はコンパイラによって異なる場合があります。TR1 では、拡張機能を配置する必要がある名前空間が指定されていないと思います。MSVC では、名前空間std::tr1が使用されます)

これとは別に、32 ビット整数は、コンパイラによって既に 4 バイトにアラインされています (少なくとも、32 ビット int の自然なアラインメントが 4 バイトであるプラットフォームでは)。

于 2010-01-23T22:52:46.693 に答える
0

私は Mac のプログラミングについては何も知りませんが、以前使用していたミニコンピューターでは、ポインターは常に 4 バイト (ワード) 境界で整列されていました。IIRC、構造体もそうでした。割り当てられたメモリは常にそうでした。

于 2010-01-23T20:11:16.817 に答える
-1

構造体の適切な位置合わせを強制したい場合は、ビット フィールドを使用できます。

struct 
{
   Foo _hisFoo;
   unsigned int dummyAlignment : 0;
   Foo _myFoo;
}
于 2010-01-23T20:19:32.400 に答える