非8字节对齐的内存访问会导致iPhone 3GS与iOS 4.0的内存访问冲突

Lar*_*der 2 memory iphone malloc arm objective-c++

考虑以下Objective-C++ iPhone应用程序(TestMemAppDelegate.mm).它与iPhone上的EXC_BAD_ACCESS崩溃(带有iOS 4.0的3GS).它在模拟器中工作正常.它显然是一个内存对齐的东西,因为如果"DataA"结构在8字节边界上启动,它在iPhone上工作正常.

任何人都可以解释原因吗?这是ARM架构的一部分吗?ARM编译器?

@implementation TestMemAppDelegate


typedef struct DataA
{
 float    x;
 unsigned char  y;
};


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

 char* mem1 = (char*)malloc(4096);

 DataA* ptrA = (DataA*)(mem1 + 1); // Here we shift the alignment
 ptrA->x = 10.0f;
 printf("A: %.2f\n", ptrA->x); // Here it crashes



    // Add the view controller's view to the window and display.
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];

    return YES;
}


@end
Run Code Online (Sandbox Code Playgroud)

ian*_*ian 6

是的,这是一个对齐问题.浮点需要4字节对齐.Intel x86 CPU允许错误对齐访问(但性能下降).在ARM上,它是不允许的,并生成您看到的错误.