【问题标题】:How to deal with compiler optimization problems如何处理编译器优化问题
【发布时间】:2010-09-30 19:13:59
【问题描述】:

我的 iPhone 应用程序出现了一个恼人的问题。每当我将优化级别设置为“无”以外的其他值时,都会出现计算错误。这只发生在为 iPhone SDK 构建时(iPhone 模拟器总是可以的)。

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

应用程序很复杂,因此很难找到优化过于激进的部分。

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

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

【问题讨论】:

标签: iphone xcode optimization gcc arm


【解决方案1】:

是的,这完全有可能。 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) {
    /* ... */
}

【讨论】:

  • 上面的“答案”不起作用。 __attribute__((optimize)) 以及相应的编译指示不适用于 GCC 4.0 / 4.2,因此不适用于 iPhone。
  • 我想知道为什么这个答案被标记为已接受,编译器不知道优化属性。或者有人可以告诉我如何使这项工作?谢谢!
  • 对于 Apple LLVM 编译器 (Xcode 4.0+),请遵循以下建议:stackoverflow.com/questions/5625624/…
  • 在 Mac 上写 gcc 时,不是执行 GCC,而是执行 LLVM。
【解决方案2】:

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

【讨论】:

  • 有趣。就我而言,有问题的代码位于开源的 3rd 方库中。代码库很大,所以很难确定。
【解决方案3】:

请检查您的函数是否正确使用returning 值。根据我的经验,以下方法有时有效:

int myFunc()
{
  x+7;
}

注意 return 关键字的故意和不安全的省略

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

启用优化后,寄存器使用会发生变化,并且该功能无法执行您想要的操作。

检查您的编译器警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 2016-02-14
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多