C ++ et QT4.5 – passe-t-il un const int & overkill? Est-ce que passer par référence aide dans les signaux / slots?

Deux questions réunies en une ici …

J’ai un certain nombre de fonctions appelées plusieurs fois par image pour une application de traitement vidéo en temps réel. En prenant conseil sur const et pass par référence, les fonctions ont une signature un peu comme celle-ci

void processSomething(const int& value); 

Tandis que je continue à taper les quelques caractères supplémentaires, je me demande si c’est exagéré.

Deuxième question, eh bien, au sujet du passage par référence, dans le mécanisme des slots / signaux de QT, le passage par référence aide-t-il à empêcher la copie d’objects comme dans un appel de fonction normal?

Oui, cela est excessif et entraînera un code plus lent que si vous passiez l’int par valeur. Un int est quatre octets; une référence (essentiellement une adresse mémoire) correspond également à quatre octets (sur une machine 32 bits) ou à huit octets (sur une machine 64 bits). Il se peut donc que vous deviez transmettre plus d’ informations à la fonction. En outre, vous avez le temps nécessaire pour déréférencer cette référence.

Si vous transmettez quelque chose de plus gros qu’un int, cependant, il est plus efficace d’utiliser une référence const, car vous pouvez ne transmettre que quatre ou huit octets au lieu de devoir copier tout l’object.

Edit Concerning Qt: Oui, si l’emplacement prend une référence const à un object, la raison en est d’enregistrer le temps système nécessaire à la copie de l’object.

Oui, passer par référence aide à éviter la copie des objects. Mais le compilateur peut décider de l’optimiser entièrement et d’installer instal pass by value s’il produit le même effet. Une telle optimisation est généralement possible si la fonction et le site d’appel se trouvent dans la même unité de traduction, mais certains compilateurs peuvent effectuer des optimisations encore plus globales – vous pouvez inspecter l’ensemble émis si vous en tenez compte.

C’est pourquoi vous ne devriez vraiment pas passer de types primitifs par référence si vous vous souciez de la performance et à moins que vous n’ayez vraiment des raisons pour cela. Voir Quelle est l’utilisation de la transmission de références const à des types primitifs? pour la discussion de ce problème.

Premièrement – la différence entre

  • void processSomething (const int & value);
  • processus videQuelque chose (valeur int);

is: normalement une référence de const est passée en passant un pointeur, l’autre chose est passée en copiant. Après l’appel (du côté de l’appelant), le résultat est égal. Tout ce que vous transmettez à la fonction n’est pas modifié par l’appel.

Dans la fonction, vous ne verrez aucune différence non plus (au moins sur un int). Sur les objects, vous ne pouvez utiliser que les fonctions const bien sûr.

Du côté des performances, le passage d’une référence const à un int peut (ou peut ne pas être) être plus lent, selon le compilateur et l’optimisation. Le compilateur pourrait (en théorie) optimiser le passage de la référence const à un passage par valeur, je ne sais pas si c’est le cas. Travailler avec des pointeurs sur des éléments au lieu de valeurs est bien sûr plus lent.

Pour plus d’informations à ce sujet, voir: Quand utiliser les pointeurs et quand ne pas les utiliser


Après avoir lu l’autre publication liée, le compilateur ne peut pas l’optimiser dans un environnement multithread. Au moins dans un environnement MT, il existe de réelles différences entre les appels const int et int. +1 pour ce lien.