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

我猜任何 SInt32 都已经对齐,即使在 Mac 上也是如此。

澄清:

struct Foo {
    SInt32 member;
};

成员始终正确对齐,除非您打包结构并将成员放在字符之后。

于 2010-01-23T20:13:02.383 回答
1

int默认情况下,s 与任何 OS X 编译器都是 4 字节对齐的。您需要做的不是故意破坏这种对齐方式(例如,通过不正确的指针强制转换、将结构标记为packed等)。

于 2010-01-23T20:51:41.543 回答
0

我对 Mac 编程一无所知,但在我曾经使用过的小型计算机上,指针总是在 4 字节(字)边界上对齐。IIRC,结构也是。分配的内存总是如此。

于 2010-01-23T20:11:16.817 回答
0

如果您的编译器支持 TR1(或 C++0x),则可以使用该std::aligned_storage模板。

要为具有大小S和对齐方式的对象分配空间A,您可以分配类型的对象std::aligned_storage<S, A>::storage

(命名空间可能因编译器而异。我认为 TR1 没有指定扩展必须放在哪个命名空间中。在 MSVC 上,使用命名空间std::tr1

Apart from this, 32-bit integers are already 4-byte aligned by the compiler (at least on the platforms where the natural alignment of 32-bit ints is 4 bytes)

于 2010-01-23T22:52:46.693 回答
-1

如果你想在结构中强制对齐,你可以使用位域。

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