2014-01-16 3 views
4

Я тестирую выравнивание, и я определяю что-то странное с симулятором iOS (XCode 4.3.2 и XCode 4.5).iOS Simulator memory alignment

На симуляторе iOS структуры выровнены по 8-байтовой границе, даже если атрибут ((выровненный (4))) используется для принудительной границы 4 байта. Убедитесь, что его заполнено 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); 
} 

(EDIT Оптимизации выключены, -O0)

  • Результаты моделирования (iOS 5.1);

    (lldb) х ` & Mys ` -fx

    0xbfffda60: 0xa1b1c1d1 0xf2e28292 0x00000001 0x09080706

    0xbfffda70: 0x01020304

    & force16ByteBoundary: 0xbfffd a70/& some4Byte: 0xbfffda6c/& МЫС: 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. 

(EDIT)

я мог только узнать "Тип данных и выравнивание данных" для прошивки here. (Также они могут быть оцифрованы из ILP32 alignments here.)

+2

Simulator - это Intel, iDevice - это ARM ... разные архитектуры ... ARM является более ограничивающим с выравниванием байтов, а Intel более прощает. –

+0

Устройство, на котором запущен симулятор, составляет 64 бит? –

+0

Является ли результат тем же самым в отладке и выпуске? –

ответ

0

Как правило, атрибуты выравнивания влияют только на относительное выравнивание элементов внутри структуры. Это обеспечивает обратную совместимость с кодом, который хочет просто скопировать данные в структуру непосредственно из сетевого или двоичного файла.

Атрибуты выравнивания не влияют на выравнивание локальных переменных, выделенных в стеке. Порядок и выравнивание элементов в стеке не гарантируется и, как правило, оптимально выравнивается для каждого элемента устройства. Таким образом, если устройство на базе 386 может извлечь 64-битную длинную память из одной операции с помощью 8-байтового согласования, она сделает это. Некоторые процессоры фактически теряют значительную производительность, если данные не полностью выровнены. Некоторые процессоры могут генерировать исключения для попытки чтения данных, которые не были правильно выровнены.