69 votes

Quelle est la différence entre la répartition dynamique et la liaison tardive en C++ ?

J'ai récemment lu des articles sur le Dynamic Dispatch sur Wikipedia et ne comprenait pas la différence entre la répartition dynamique et la liaison tardive en C++.

Quand chacun des mécanismes est utilisé ?

La citation exacte de Wikipedia :

La répartition dynamique est différente de la liaison tardive (également appelée liaison dynamique). Dans le contexte de la sélection d'une opération, la liaison fait référence au processus d'association d'un nom à une opération. La répartition consiste à choisir une implémentation pour l'opération après avoir décidé à quelle opération un nom fait référence. Avec la répartition dynamique, le nom peut être lié à une opération polymorphe au moment de la compilation, mais l'implémentation ne sera choisie qu'au moment de l'exécution (c'est ainsi que la répartition dynamique fonctionne en C++). Cependant, la liaison tardive implique une répartition dynamique puisque vous ne pouvez pas choisir l'implémentation d'une opération polymorphe à sélectionner avant d'avoir sélectionné l'opération à laquelle le nom fait référence.

63voto

WhozCraig Points 32734

Une réponse assez décente à cette question est en fait incorporée dans une question sur les liaisons tardives et précoces sur le site Web de la Commission européenne. programmeurs.stackexchange.com .

En bref, la fixation tardive fait référence à la objet -La répartition dynamique fait référence au côté fonctionnel d'un eval. Dans la liaison tardive, le type d'une variable est la variante au moment de l'exécution. Dans le cas du dynamic-dispatch, la fonction ou la sous-routine exécutée est la variante.

En C++, nous n'avons pas vraiment de liaison tardive car le type est connu (pas nécessairement la fin de la hiérarchie de l'héritage, mais au moins une classe ou une interface de base formelle). Mais nous faire ont une répartition dynamique via des méthodes virtuelles et le polymorphisme.

Le meilleur exemple que je puisse offrir pour la liaison tardive est l'objet non typé de Visual Basic. L'environnement d'exécution fait tout le travail de liaison tardive pour vous.

Dim obj

- initialize object then..
obj.DoSomething()

Le compilateur codera en fait le contexte d'exécution approprié pour que le moteur d'exécution effectue une consultation nommée de la méthode appelée DoSomething et, s'il est découvert avec les paramètres correspondants, il exécute réellement l'appel sous-jacent. En réalité, quelque chose sur le type de l'objet est connu (il hérite de IDispatch et soutient GetIDsOfNames() etc.), mais en ce qui concerne l langue est concerné par le type de la variable est totalement inconnu au moment de la compilation, et il n'a aucune idée si DoSomething est même une méthode pour ce que obj en fait es jusqu'à ce que le runtime atteigne le point d'exécution.

Je ne prendrai pas la peine de vous présenter une interface virtuelle C++ et autres, car je suis sûr que vous savez déjà à quoi elles ressemblent. J'espère qu'il est évident que le langage C++ ne peut tout simplement pas faire cela. Il est fortement typé. Il puede (et fait, évidemment) la répartition dynamique via la fonction de méthode virtuelle polymorphe.

8voto

Yochai Timmer Points 19802

La liaison tardive consiste à appeler une méthode par son nom pendant l'exécution. Cela n'existe pas vraiment en C++, sauf pour l'importation de méthodes depuis une DLL.
Un exemple de cela serait : GetProcAddress ()

Avec la répartition dynamique, le compilateur dispose de suffisamment d'informations pour appeler la bonne implémentation de la méthode. Cela se fait généralement en créant un table virtuelle .

8voto

M M. Points 29201

El lien a lui-même expliqué la différence :

La répartition dynamique est différente de la liaison tardive (également appelée liaison dynamique). Dans le contexte de la sélection d'une opération, la liaison fait référence au processus d'association d'un nom à une opération. La répartition consiste à choisir une implémentation pour l'opération après avoir décidé à quelle opération un nom fait référence.

et

Avec la répartition dynamique, le nom peut être lié à une opération polymorphe au moment de la compilation, mais l'implémentation ne sera choisie qu'au moment de l'exécution (c'est ainsi que la répartition dynamique fonctionne en C++). Cependant, la liaison tardive implique une répartition dynamique puisque vous ne pouvez pas choisir l'implémentation d'une opération polymorphe avant d'avoir sélectionné l'opération à laquelle le nom fait référence.

Mais ils sont pratiquement égaux en C++, vous pouvez faire une répartition dynamique par des fonctions virtuelles et des vtables.

Le C++ utilise la liaison précoce et offre une répartition dynamique et statique. La forme par défaut de la répartition est statique. Pour obtenir une répartition dynamique, vous devez déclarer une méthode comme étant virtuelle.

5voto

Nawaz Points 148870

En C++, les deux sont identiques.

En C++, il existe deux types de liaisons :

  • la liaison statique - qui est effectuée au moment de la compilation.
  • la liaison dynamique - qui est effectuée au moment de l'exécution.

La liaison dynamique, puisqu'elle est effectuée au moment de l'exécution, est également appelée reliure tardive et la liaison statique est parfois appelée liaison précoce .

En utilisant la liaison dynamique, C++ supporte le polymorphisme à l'exécution par le biais de virtuel fonctions (ou pointeurs de fonction ), et en utilisant la liaison statique, toutes les autre les appels de fonctions sont résolus.

5voto

bhupinder Points 120

Reliure fait référence au processus d'association d'un nom à une opération.

la chose principale ici est les paramètres de la fonction, ils décident de la fonction à appeler au moment de l'exécution.

Dispatching consiste à choisir une implémentation pour l'opération après avoir décidé à quelle opération un nom fait référence.

distribuer le contrôle à cet endroit en fonction de la correspondance des paramètres

http://en.wikipedia.org/wiki/Dynamic_dispatch

J'espère que cela vous aidera

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