我正在测试对齐并发现iOS模拟器有些奇怪的东西。(XCode 4.3.2和XCode 4.5)
在iOS模拟器中,即使使用属性((aligned(4)))强制为4字节边界,结构体仍会被对齐到8字节边界。检查是否末尾填充了0x00000001来对齐到8字节边界。
如果myStruct变量在全局作用域中定义,则模拟器将其对齐到4字节边界,因此可能与堆栈相关。
模拟器是i386,因此它是32位的,必须对齐到4字节边界。那么,它对齐到64位边界的原因是什么?这是一个功能还是一个错误?
(我知道与模拟器斗争并不必要,但它可能导致陷入微妙的问题。)
typedef struct myStruct
{
int a;
int b;
} myStruct;
//} __attribute__ ((aligned (4))) myStruct;
-(void)alignmentTest
{
// Offset 16*n (0x2fdfe2f0)
int __attribute__ ((aligned (16))) force16ByteBoundary = 0x01020304;
// Offset 16*n-4 (0x2fdfe2ec)
int some4Byte = 0x09080706;
// Offset 16*n-12 (0x2fdfe2e4)
myStruct mys;
mys.a = 0xa1b1c1d1;
mys.b = 0xf2e28292;
NSLog(@"&force16ByteBoundary: %p / &some4Byte: %p / &mys: %p",
&force16ByteBoundary, &some4Byte, &mys);
}
(编辑 优化关闭,-O0)
模拟器(iOS 5.1) 测试结果;
(lldb) x `&mys` -fx
0xbfffda60: 0xa1b1c1d1 0xf2e28292 0x00000001 0x09080706
0xbfffda70: 0x01020304
&force16ByteBoundary: 0xbfffda70 / &some4Byte: 0xbfffda6c / &mys: 0xbfffda60
设备(iOS 5.1) 测试结果;
(lldb) x `&mys` -fx
0x2fdfe2e4: 0xa1b1c1d1 0xf2e28292 0x09080706 0x01020304
&force16ByteBoundary: 0x2fdfe2f0 / &some4Byte: 0x2fdfe2ec / &mys: 0x2fdfe2e4
(新发现)
- On Simulator and Device;
- Building for Release or Debug does not make any difference for alignments.
- Local or global variables of "long long", double types are aligned to 8 byte boundary although they must be aligned to 4 byte boundary.
- There is no problem with global variables of structs.
- On Simulator;
- Local variables of structs are aligned to 8 byte boundary even when there is only a char member in the struct.
(编辑)
我只能在这里找到iOS的“数据类型和数据对齐方式” (链接)。 另外,它们可以从ILP32对齐方法中推断出来。