Как бороться с проблемами оптимизации компилятора

StackOverflow https://stackoverflow.com/questions/433261

Вопрос

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

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

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

Я думаю, что проблема на стороне 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) {
    /* ... */
}

Другие советы

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

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

int myFunc()
{
  x+7;
}

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top