我正在測試對齊方式,並確定iOS模擬器有些奇怪(XCode 4.3.2和XCode 4.5)。iOS模擬器內存對齊
在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)×` & MYS ` -fx
0xbfffda60:0xa1b1c1d1 0xf2e28292 0x09080706
0xbfffda70:0x01020304
& force16ByteBoundary:0xbfffd A70/& some4Byte:0xbfffda6c/& MYS: 0xbfffda60
設備(iOS 5中。1)結果;
(LLDB)×` & 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 here。 (另外,它們可以從ILP32 alignments here.推斷出)
模擬器是英特爾,iDevice是ARM ...不同的架構...... ARM的字節對齊方式更具限制性,英特爾更寬容。 –
您正在運行模擬器的設備是64位? –
調試和發佈版本的結果是否相同? –