我的 iPhone 应用程序有一个烦人的问题。每当我将优化级别设置为“无”以外的其他值时,都会出现计算错误。这只发生在为 iPhone SDK 构建时(iPhone 模拟器总是很好)。
我不介意在发布模式下禁用优化,但是当我这样做时应用程序有点太慢了。
应用程序很复杂,因此很难找到过于积极优化的部分。
我认为问题出在 GCC 方面,因为它似乎在优化 ARM 架构的代码方面存在问题。
有没有办法只对代码的某些部分禁用优化?你会如何处理这样的问题?
我的 iPhone 应用程序有一个烦人的问题。每当我将优化级别设置为“无”以外的其他值时,都会出现计算错误。这只发生在为 iPhone SDK 构建时(iPhone 模拟器总是很好)。
我不介意在发布模式下禁用优化,但是当我这样做时应用程序有点太慢了。
应用程序很复杂,因此很难找到过于积极优化的部分。
我认为问题出在 GCC 方面,因为它似乎在优化 ARM 架构的代码方面存在问题。
有没有办法只对代码的某些部分禁用优化?你会如何处理这样的问题?
是的,这完全有可能。GCC 有一个属性:
/* 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) {
/* ... */
}
如果优化改变了程序的行为,您可能会不知不觉地依赖于未定义或实现定义的行为。可能值得仔细查看您的代码,着眼于关于变量值和评估顺序的假设。
请检查您是否正确地return
从您的函数中获取值。根据我的经验,以下方法有时有效:
int myFunc()
{
x+7;
}
注意 return 关键字的故意和不安全的省略
由于表达式计算中使用的寄存器与返回寄存器相同。
打开优化时,注册使用更改并且该功能无法执行您想要的操作。
检查您的编译器警告。