如何处理编译器优化问题

时间:2009-01-11 17:30:02

标签: iphone xcode optimization gcc arm

我的iPhone应用程序遇到了烦人的问题。每当我将优化级别设置为“无”以外的其他级别时,我就会遇到计算错误。这只发生在为iPhone SDK构建时(iPhone模拟器总是很好)。

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

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

我认为问题出在GCC方面,因为它似乎在优化ARM架构的代码时遇到了问题。

有没有办法只对代码的某些部分禁用优化?你会如何处理这类问题?

3 个答案:

答案 0 :(得分:12)

是的,这完全有可能。海湾合作委员会有一个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) {
    /* ... */
}

答案 1 :(得分:4)

如果优化改变了程序的行为,您可能会在不知不觉中依赖于未定义或实现定义的行为。值得仔细研究一下您的代码,并着眼于对变量值和评估顺序的假设。

答案 2 :(得分:0)

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

int myFunc()
{
  x+7;
}

请注意return关键字

的故意和不安全遗漏

由于表达式计算中使用的寄存器与返回寄存器相同。

当启用优化时,注册使用更改并且该功能无法执行您想要的操作。

检查编译器警告。