Je travaille dans le projet dans lequel j'ai le code suivant:Optimisation pour la division sur "extern const int"
fichier1.c
extern const int z;
int x;
do_some_stuff_to_calculate_x();
y = x/z;
do_some_stuff_with_y();
fichier2.c
const int z = Z_INIT_VALUE; // some value defined in some .h file.
Le point d'intérêt est la division en file1.c
. Puisque z
est extern
, il n'est donc pas connu au moment de la compilation [il sera défini en temps de liaison]. Ainsi, le compilateur ne peut pas optimiser la division.
Je sais que si la valeur de z
est connue au moment de la compilation, le compilateur convertira la division en multiplication et d'autres manipulations. Notez que file1.c sera livré en tant que bibliothèque, donc recompiler file1.c
avec file2.c
n'est pas une option.
Est-ce que quelqu'un sait à l'avance que l'éditeur de liens optimise de telles choses? Ou toute autre astuce pour éviter cette division CHERCHANTE?
Thx :)
Mise à jour:
Eh bien, après avoir vu des réponses que je remarquai que quelques détails sont nécessaires pour rendre cette question plus d'information. J'utilise un microcontrôleur de la société renesas (famille SH725).
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;
}
Cette fonction est la forme de fonction typique dans tout le programme. Je ne peux pas savoir exactement combien de division affecte le programme parce que j'ai beaucoup de ces fonctions avec une périodicité différente.
Mais quand j'ai essayé d'enlever le extern
du const
et lui a donné une valeur arbitraire, c'était mieux.
Mettez le const dans un en-tête? –
@Pavel: Devrait être un '# define' alors, ou vous vous retrouverez avec plusieurs définitions. – Thomas
++ J'ai toujours upvote newbies :) –