4 votes

Puis-je augmenter le nombre d'int i de plus d'une unité en utilisant la syntaxe i++ ?

Int fkt(int &i) { retour i++ ; }

int main()
{
  int i = 5;
  printf("%d ", fkt(i));
  printf("%d ", fkt(i));
  printf("%d ", fkt(i));
}

imprime '5 6 7 '. Si je veux imprimer '5 7 9 ' comme ceci, est-il possible de le faire de manière similaire sans variable temporaire dans fkt() ? (Une variable temporaire diminuerait marginalement l'efficacité, n'est-ce pas ?) C'est-à-dire quelque chose comme

return i+=2 

o

return i, i+=2; 

qui à la fois augmentent d'abord i et le renvoient ensuite, ce qui n'est pas ce dont j'ai besoin.

Merci

EDIT : La raison principale pour laquelle je le fais dans une fonction et non en dehors est que fkt sera un pointeur de fonction. La fonction originale fera quelque chose d'autre avec i. J'ai juste l'impression qu'utiliser {int temp = i ; i+=2 ; return temp;} n'est pas aussi agréable que {return i++;}.

Je ne me soucie pas de printf, c'est juste pour illustrer l'utilisation du résultat.

EDIT2 : Wow, cela semble être plus un chat ici qu'un forum traditionnel :) Merci pour toutes les réponses. Mon fkt est en fait le suivant. En fonction de certaines conditions, je définirai get_it comme étant soit get_it_1, soit get_it_2, soit get_it_4 :

unsigned int (*get_it)(char*&);

unsigned int get_it_1(char* &s)
  {return *((unsigned char*) s++);}
unsigned int get_it_2(char* &s)
  {unsigned int tmp = *((unsigned short int*) s); s += 2; return tmp;}
unsigned int get_it_4(char* &s)
  {unsigned int tmp = *((unsigned int*) s); s += 4; return tmp;}

Pour get_it_1, c'est très simple... J'essaierai de donner plus de détails à l'avenir...

28voto

S.Lott Points 207588

"Une variable temporaire diminuerait marginalement l'efficacité, non ?"

Faux.

L'avez-vous mesuré ? Sachez que ++ n'a des pouvoirs magiques d'efficacité que sur un PDP-11. Sur la plupart des autres processeurs, c'est juste la même chose que +=1 . Veuillez mesurer les deux pour voir quelles sont les différences réelles.

18voto

Cogwheel Points 8656

(Une variable temporaire ne diminuerait que marginalement l'efficacité, non ?).

Si c'est la principale raison de votre demande, alors vous vous inquiétez beaucoup trop tôt. Ne remettez pas en question votre compilateur avant d'avoir un réel problème de performance.

Si vous voulez que fkt puisse ajouter différentes quantités à i, alors vous devez passer un paramètre. Il n'y a aucune raison matérielle de préférer ++ sur += .

9voto

Donald Miner Points 18116

Vous pourriez incrémenter deux fois, puis soustraire, quelque chose comme ça :

return (i += 2) - 2

Pour répondre à la question, je ne pense pas que vous deviez avoir peur d'utiliser une variable temporaire.

4voto

Ramónster Points 1237

Si vous avez vraiment besoin de cette vitesse, vérifiez le code d'assemblage que le compilateur produit. Si vous le faites :

int t = i;
i+=2;
return t;

alors le compilateur peut l'optimiser tout en inlining la fonction en quelque chose comme :

printf("%d ", i);
i+=2;

Ce qui est aussi bien que ça va l'être.

EDIT : Maintenant vous dites que vous sautez à cette fonction via un pointeur de fonction ? Appeler une fonction par un pointeur est plutôt lent comparé à l'utilisation d'une variable temporaire. Je ne suis pas certain, mais je crois me souvenir que les documents d'Intel disent que cela représente environ 20-30 cycles de processeur sur les Core 2 et i7, si le code de votre fonction est entièrement en cache. Comme le compilateur ne peut pas mettre en ligne votre fonction lorsqu'elle est appelée par un pointeur, le ++ créera également une variable temporaire de toute façon.

3voto

RvdK Points 10793

Une variable temporaire serait marginalement l'efficacité, non ?

Il faut toujours tenir compte du fait que "l'optimisation prématurée est la racine de tous les maux". Passez du temps sur d'autres parties puis essayez d'optimiser celle-ci. += et ++ auront probablement le même résultat. Votre PC s'en sortira ;)

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