2014-01-16 2 views
4

정렬을 테스트 중이며 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.에서 유추 할 수 있습니다.)

+2

시뮬레이터는 인텔, iDevice는 ARM ... 다른 아키텍처 ... ARM은 바이트 정렬을 통해 더욱 제한적이며 인텔은 더 용서합니다. –

+0

시뮬레이터를 실행중인 장치는 64 비트입니까? –

+0

디버그 및 릴리스 빌드에서 결과가 동일합니까? –

답변

0

일반적으로 정렬 속성은 구조체 내부의 항목의 상대적 정렬에만 영향을줍니다. 이렇게하면 데이터를 네트워크 또는 바이너리 파일에서 직접 구조로 대량 복사하는 코드와의 이전 버전과의 호환성을 유지할 수 있습니다.

정렬 속성은 스택에 할당 된 로컬 변수의 정렬에 영향을주지 않습니다. 스택의 항목 정렬 및 정렬은 보장되지 않으며 일반적으로 장치의 각 항목에 대해 최적으로 정렬됩니다. 따라서 386 기반 장치가 8 바이트 길이로 메모리에서 한 번의 작업으로 64 비트 long long을 페치 할 수 있다면 이렇게 할 수 있습니다. 일부 프로세서는 데이터가 완전히 정렬되지 않은 경우 실제로 성능이 크게 저하됩니다. 일부 프로세서는 올바르게 정렬되지 않은 데이터를 읽는 동안 예외를 throw 할 수 있습니다.