如何确保成员是4字节对齐的?

时间:2010-01-23 20:06:53

标签: c++ atomic memory-alignment

为了使用OSAtomicDecrement(特定于mac的原子操作),我需要提供一个4字节对齐的SInt32。

这种烹饪有用吗?有没有其他方法来处理对齐问题?

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

  SInt32 *member_;

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

6 个答案:

答案 0 :(得分:5)

如果您使用的是Mac,则表示GCC。 GCC可以为您自动对齐变量:

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

请注意,这不能在编译器之间移植,因为这是GCC特定的。

答案 1 :(得分:4)

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

澄清:

struct Foo {
    SInt32 member;
};

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

答案 2 :(得分:1)

对于任何OS X编译器,

int默认为4字节对齐。您需要做的就是不要故意破坏该对齐(例如,通过执行不正确的指针转换,将结构标记为packed等)。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

要为大小为S且对齐A的对象分配空间,您可以分配std::aligned_storage<S, A>::storage类型的对象。

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

除此之外,编译器已经将32位整数对齐(至少在32位整数的自然对齐为4字节的平台上)

答案 5 :(得分:-1)

如果要在结构中强制进行良好的对齐,可以使用位字段。

struct 
{
   Foo _hisFoo;
   unsigned int dummyAlignment : 0;
   Foo _myFoo;
}