Partage
  • Partager sur Facebook
  • Partager sur Twitter

Début du programme sur C

opération sur C

20 janvier 2020 à 1:24:40

@michelbillaud;
J'avais compris que "déclaration" ou "définition" avaient peu à voir avec "création".
Les variables sont "créées" à la compilation dans le sens que l'espace est prévu et la gestion est générée à ce moment.
Par contre, le traitement des variables globales est probablement différent des variables locales à une fonction. La gestion des variables d'une fonction est plus complexe.
Je suppose que leurs adresses doivent être obtenues sur la pile alors que ça ne devrait pas être nécessaire pour les variables globales.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

20 janvier 2020 à 10:26:39

Il ne parle pas de la variable hors de la boucle, mais hors de la fonction ;) 

Et dans ce cas, sans pousser l'optimisation du compilateur , on peut y noter une différence "significative" ( dans le sens où elle est mesurable)

double tmp;

void echanger1(double *a,double *b)
{
 tmp=*a:
 *a=*b;
 *b=tmp;
}

void echanger2(double *a,double *b)
{
 double tmp=*a;
 *a=*b;
 *b=tmp;
}

//pas besoin de plus compliqué pour la mesure
La différence est que sans optimisation du compilateur, le code echanger2 est un poil plus lent (mesurable mais négligeable) que echanger1.



  • Partager sur Facebook
  • Partager sur Twitter
20 janvier 2020 à 12:33:52

(erreur ligne 5, deux-points au lieu de point virgule)

Euh, si on s'intéresse aux performance du code généré par un compilateur (*) et qu'on veut en tirer des conclusions, on le fait en activant une/des options d'optimisation.

Il y a plusieurs critères, comme obtenir le code le plus court, ou le code le plus rapide. Ce n'est pas la même chose, et c'est même contradictoire (dépliage de boucles...), donc il y a un choix à faire sur les objectifs.

Sinon, avec les options par défaut le compilateur fait du code de goret sans tenter d'optimiser, parce que les optimisations sont coûteuses. C'est utile aussi quand on recompile un programme de dizaines de milliers de lignes pour sa mise au point.

Si on regarde le code compilé avec option -Os, il y a pas photo

echanger1:
	movsd	(%rdi), %xmm0
	movsd	%xmm0, tmp(%rip)
	movsd	(%rsi), %xmm0
	movsd	%xmm0, (%rdi)
	movsd	tmp(%rip), %xmm0
	movsd	%xmm0, (%rsi)
	ret

echanger2:
	movsd	(%rdi), %xmm0
	movsd	(%rsi), %xmm1
	movsd	%xmm1, (%rdi)
	movsd	%xmm0, (%rsi)
	ret


Deux instructions de plus, parce qu'il faut mettre à jour la variable globale (au cas où on aurait des threads qui veulent y toucher aussi, allez savoir).

-
Edité par michelbillaud 20 janvier 2020 à 12:34:15

  • Partager sur Facebook
  • Partager sur Twitter