Как бороться с проблемами оптимизации компилятора
-
10-07-2019 - |
Вопрос
У меня проблема с приложением для 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
, поскольку регистр, используемый в вычислении выражения, совпадает с регистром возврата. Р>
Когда оптимизация включена, зарегистрируйте изменения использования, и функция не сможет выполнить то, что вы хотите. Р>
Проверьте предупреждения вашего компилятора.