为了使用OSAtomicDecrement(特定于mac的原子操作),我需要提供一个4字节对齐的SInt32。
这种烹饪有用吗?有没有其他方法来处理对齐问题?
struct SomeClass {
SomeClass() {
member_ = &storage_ + ((4 - (&storage_ % 4)) % 4);
*member_ = 0;
}
SInt32 *member_;
struct {
SInt32 a;
SInt32 b;
} storage_;
};
答案 0 :(得分:5)
如果您使用的是Mac,则表示GCC。 GCC可以为您自动对齐变量:
__attribute__((__aligned__(4))) int32_t member_;
请注意,这不能在编译器之间移植,因为这是GCC特定的。
答案 1 :(得分:4)
我猜想任何SInt32已经对齐,即使在Mac上也是如此。
澄清:
struct Foo {
SInt32 member;
};
成员始终正确对齐,除非您打包结构并将成员放在字符后面。
答案 2 :(得分:1)
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;
}