정렬을 테스트 중이며 iOS 시뮬레이터로 이상한 점을 결정합니다 (XCode 4.3.2 및 XCode 4.5).iOS 시뮬레이터 메모리 정렬
iOS 시뮬레이터에서는 속성 ((aligned (4)))을 사용하여 4 바이트 경계를 강제하더라도 구조가 8 바이트 경계에 정렬됩니다. 8 바이트 경계를 맞추려면 마지막에 0x00000001으로 채워져 있는지 확인하십시오.
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) 결과;
X (lldb) ` & MYS ` -fx
0xbfffda60 : 0xa1b1c1d1 0xf2e28292 0x00000001 0x09080706
0xbfffda70 : 0x01020304
& force16ByteBoundary : 0xbfffd A70/& some4Byte : 0xbfffda6c/& MYS : 0xbfffda60
장치 (아이폰 OS 5.1) 결과;
X (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.
(EDIT)
난 단지 "데이터 유형 및 데이터 정렬"알 아이폰 OS here에 대한 수 있습니다. (또한 이들은 ILP32 alignments here.에서 유추 할 수 있습니다.)
시뮬레이터는 인텔, iDevice는 ARM ... 다른 아키텍처 ... ARM은 바이트 정렬을 통해 더욱 제한적이며 인텔은 더 용서합니다. –
시뮬레이터를 실행중인 장치는 64 비트입니까? –
디버그 및 릴리스 빌드에서 결과가 동일합니까? –