2009-01-11 51 views
4

我遇到了一个恼人的问题,我的iPhone应用程序。无论何时将优化级别设置为“无”以外的其他值,都会发生计算错误。这只发生在构建iPhone SDK时(iPhone模拟器总是正常)。如何处理编译器优化问题

我不介意在发布模式下禁用优化,但当我这样做时,应用程序太慢了。

该应用程序非常复杂,因此很难找到过于积极优化的零件。

我认为这个问题是在GCC方面,因为它似乎有优化ARM体系结构代码的问题。

有没有办法只禁用优化只为特定部分的代码?你将如何处理这类问题?

+0

针对Xcode 4(Apple LLVM编译器)的解决方案:http://stackoverflow.com/questions/5625624/trouble-disabling-llvm-optimizations-via-pragma?lq=1 – LearnCocos2D 2012-08-22 16:15:47

回答

12

是的,这是完全可能的。 GCC有,一个attribute

/* disable optimization for this function */ 
void my_function(void) __attribute__((optimize(0))); 

void my_function(void) { 
    /* ... */ 
} 

设置该功能-O0优化级别。您可以启用/禁用特定的优化:

/* disable optimization for this function */ 
void my_function(void) __attribute__((optimize("no-inline-functions"))); 

void my_function(void) { 
    /* ... */ 
} 
+0

上面的“答案”不起作用。 __attribute __((优化))以及相应的编译指示不适用于GCC 4.0/4.2,因此不适用于iPhone。 – 2010-01-08 10:02:50

+0

我想知道为什么这个答案被标记为接受,优化属性未知的编译器。或者有人可以告诉我如何使这项工作?谢谢! – 2011-11-09 00:27:00

4

如果优化改变了你的程序的行为,你可能不知不觉地依赖于不确定的或实现定义的行为。值得仔细看看代码,并着眼于对变量值和评估顺序的假设。

0

请检查您的功能是否正确return。根据我的经验,以下只是有时工作:

int myFunc() 
{ 
    x+7; 
} 

注return关键字

的故意和不安全遗漏由于寄存器在表达式计算是一样的返回寄存器使用。

当开启优化时,注册使用更改并且该功能无法按照您的要求进行操作。

检查您的编译器警告。