Я тестирую выравнивание, и я определяю что-то странное с симулятором 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.)
Simulator - это Intel, iDevice - это ARM ... разные архитектуры ... ARM является более ограничивающим с выравниванием байтов, а Intel более прощает. –
Устройство, на котором запущен симулятор, составляет 64 бит? –
Является ли результат тем же самым в отладке и выпуске? –