2010-08-26 7 views
33

Ma compréhension est que C++ reinterpret_cast et C castor pointer est juste un une fonctionnalité de compilation et qu'il n'a aucun coût de performance du tout.reinterpret_cast cast coût

Est-ce vrai?

Répondre

49

C'est une bonne supposition pour commencer. Cependant, l'optimiseur peut être limité dans ce qu'il peut assumer en présence d'un cast de pointeur reinterpret_cast<> ou C. Ensuite, même si le cast lui-même n'a pas d'instructions associées, le code résultant est plus lent. Par exemple, si vous lancez un int sur un pointeur, l'optimiseur n'aura probablement aucune idée de ce que ce pointeur pourrait pointer vers. Par conséquent, il doit probablement supposer qu'une écriture à travers ce pointeur peut changer n'importe quelle variable. Cela bat des optimisations très courantes telles que le stockage des variables dans les registres.

+1

Je ne pense pas que "habituellement pas" était la réponse que vous vouliez pour la question "est-ce vrai?" –

+0

@Rob Kennedy: Eh, oui. Reformulé. – MSalters

+1

merci beaucoup pour cette réponse. Peut-être que dans ce cas, on peut suggérer GCC avec le mot clé register (!?). – fulmicoton

0

Oui, c'est vrai. Le type de diffusion dont le coût d'exécution est dynamic_cast.

+2

'static_cast' peut aussi avoir un coût d'exécution; Bien que ce soit habituellement un simple ajustement de pointeur, ou du code pour convertir un type en un autre (comme un 'int' dans un' float') –

+0

Est-ce que static_cast' n'appellera pas non plus les conversions définies par l'utilisateur? Le coût d'exécution sur ceux-ci est illimité. –

+0

A droite, static_cast a un coût d'exécution dans le cas d'une conversion de type (pas de pointeur). Mon point est que dynamic_cast est le seul type de cast qui a un coût d'exécution supplémentaire, par rapport à la conversion C. –

5

C'est vrai. Aucun coût autre que tout gain/perte de performance pour l'exécution d'instructions à la nouvelle largeur, que je pourrais ajouter, n'est qu'une préoccupation dans de rares cas. Lancer des pointeurs sur toutes les plateformes dont j'ai jamais entendu parler n'a aucun coût, et aucun changement de performance.

0

Vous avez raison, mais pensez-y: reinterpret_cast signifie peut-être un mauvais design ou que vous faites quelque chose de très bas niveau. Dynamic-cast à la place cela vous coûtera quelque chose, car il doit regarder dans une table de recherche au moment de l'exécution.

+0

'dynamic_cast' est plus proche de' static_cast' avec une vérification de l'exécution plutôt que 'reinterpret_cast'. Vous ne pouvez pas lancer de types polymorphes avec 'reinterpreT_cast'. –

+1

@Billy ONeal: Vous ne pouvez pas mais polymoriquement conscient. –

0

reinterpret_cast ne génère pas de coût d'exécution .. Cependant, vous devez faire attention, car chaque utilisation de reinterpret_cast est mise en œuvre définie. Par exemple, il est possible de réinterpréter un tableau char car un tableau int peut provoquer une interruption de l'architecture cible, car différents types peuvent avoir des règles d'alignement différentes. Corrigez d'abord, puis inquiétez-vous sur l'efficacité.

4

Les transtypages de style C en C++ tenteront d'abord une static_cast et n'effectueront une réinterprétation_cast que si une conversion statique ne peut pas être effectuée. Un static_cast peut changer la valeur du pointeur dans le cas d'un héritage multiple (ou lors de la conversion d'une interface en un type concret), ce calcul de décalage peut impliquer une instruction machine supplémentaire. Ce sera au plus une instruction de machine si vraiment très petite.