Как бороться с проблемами оптимизации компилятора - PullRequest
4 голосов
/ 11 января 2009

У меня проблема с приложением для iPhone. Всякий раз, когда я устанавливаю уровень оптимизации, отличный от «Нет», я получаю ошибки в вычислениях. Это происходит только при сборке iPhone SDK (симулятор iPhone всегда в порядке).

Я не возражаю против отключения оптимизаций в режиме выпуска, но приложение слишком медленно, когда я делаю это.

Приложение сложное, поэтому трудно найти деталь, которая слишком агрессивно оптимизирована.

Я думаю, что проблема на стороне GCC, поскольку кажется, что есть проблемы с оптимизацией кода для архитектуры ARM.

Есть ли способ отключить оптимизацию только для определенной части кода? Как бы вы справились с такой проблемой?

Ответы [ 3 ]

12 голосов
/ 11 января 2009

Да, это вполне возможно. 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) {
    /* ... */
}
4 голосов
/ 11 января 2009

Если оптимизация меняет поведение вашей программы, вы можете невольно полагаться на неопределенное или определяемое реализацией поведение. Возможно, стоило бы поближе взглянуть на ваш код, взглянув на предположения о значениях переменных и порядке оценки.

0 голосов
/ 08 января 2010

Пожалуйста, убедитесь, что вы правильно return извлекаете значения из своих функций. По моему опыту, следующее только иногда работает:

int myFunc()
{
  x+7;
}

обратите внимание на преднамеренное и небезопасное упущение ключевого слова return

из-за того, что регистр, используемый в расчете выражения, совпадает с регистром возврата.

Когда оптимизация включена, зарегистрируйте изменения использования, и функция не сможет сделать то, что вы хотите.

Проверьте предупреждения вашего компилятора.

...