3 votes

Quand le calcul de la coulée est-il exécuté ?

Je n'ai jamais vraiment compris ce qui se passe quand il s'agit de faire un casting. Je suppose que le casting implicite se produit au moment de la compilation (corrigez-moi si je me trompe), mais qu'en est-il de ceci :

int i = 0;

double d = sqrt((double)i);

Cela se produira-t-il au moment de la compilation ou de l'exécution ?

6voto

Basile Starynkevitch Points 67055

Cela n'a pas d'importance, et ce n'est pas spécifié (consultez la norme C11 n1570 ). Soyez conscient de la as-if règle. Cela dépend en fait de la façon dont votre compilateur est optimisation de .

Si vous mettez votre code dans un simple main et compilez-la avec les optimisations activées, la fonction CCG Le compilateur pourrait vous donner un programme vide (puisque tous les calculs peuvent être faits au moment de la compilation, et que d n'est pas utilisé pour les effets secondaires observables).

Si vous avez GCC, compilez une fonction avec votre code en utilisant gcc -O3 -S -fverbose-asm et regarder à l'intérieur du produit *.s fichier assembleur. Vous serez surpris.

Plus précisément, avec GCC 8 sur Linux/Debian/x86-64, la compilation de

// file dvep.c
#include <math.h>
int
main (void)
{
  int i = 0;
  double d = sqrt ((double) i);
  return 0;
}

en utilisant le gcc -O3 -S -fverbose-asm dvep.c La commande produit un dvep.s dont le main se réduit à une fonction :

    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
# dvep.c:9: }
    xorl    %eax, %eax  #
    ret 
    .cfi_endproc

et vous voyez alors qu'aucune opération en virgule flottante n'a lieu au moment de l'exécution à l'intérieur de main

6voto

Govind Parmar Points 769

Cela dépend de l'optimisation et de l'architecture. Par exemple, GCC avec -O3 omettra l'appel à sqrt tout à fait pour certaines valeurs, comme on le voit aquí .

Si la variable n'est pas connue au moment de la compilation (c'est-à-dire si elle est lue à partir d'un fichier ou de l'entrée de l'utilisateur), il n'y a aucun moyen de contourner l'appel à sqrt avec la valeur double de i . Sur x86, cela nécessite une instruction comme CVTSI2SD (Convertir un entier en double mot en une valeur scalaire à virgule flottante en double précision), comme on peut le constater aquí . Le compilateur produit cette instruction au moment de la compilation, mais l'exécution de l'instruction (évidemment) a lieu au moment de l'exécution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X