Я работаю в проекте, в котором у меня есть следующий код:
file1.c
extern const int z;
int x;
do_some_stuff_to_calculate_x();
y = x / z;
do_some_stuff_with_y();
file2.c
const int z = Z_INIT_VALUE; // some value defined in some .h file.
Интересной точкой является деление на file1.c
. Поскольку z
равно extern
, поэтому оно не известно во время компиляции [оно будет определено во время компоновки].
Таким образом, компилятор не может оптимизировать деление.
Я знаю, что если во время компиляции известно значение z
, компилятор преобразует деление в умножение и некоторые другие манипуляции.
Обратите внимание, что file1.c будет доставлен в виде библиотеки, поэтому перекомпиляция file1.c
с file2.c
не подходит.
Кто-нибудь знает, чтобы компоновщик оптимизировал такие вещи?
Или любой другой трюк, чтобы избежать этого ДОРОГОГО подразделения?
Thx:)
Обновление:
Что ж, после того, как я увидел некоторые ответы, я заметил, что для того, чтобы сделать этот вопрос более информативным, требуются дополнительные подробности.
- Я использую микроконтроллер от компании renesas (Семейство SH725).
- Это разделение встречается в МНОГИХ местах кода, со многими вариантами.
- Большинство других вещей в коде - это прямое чтение и запись в регистры и порты (без накладных расходов, т.е.: * 0x0ABCDEFF = 15).
Функции, включающие деление, обычно выглядят следующим образом.
extern const int common_divisor;
extern const int common_addition;
void handleTheDamnInterrupt(void)
{
int x = *(REG_FOO_1);
int y = x / common_divisor;
y += common_addition;
if( x > some_value )
{
y += blah_blah;
}
else
{
y += foo_bar;
}
*(REG_BAR_1) = y;
}
Эта функция является типичной формой функции во всей программе. Не могу точно знать, насколько сильно разделение влияет на программу, потому что у меня много этих функций с различной периодичностью.
Но когда я попытался удалить extern
из const
и присвоил ему произвольное значение, это было лучше.