69 votes

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

J'ai récemment lu à propos de l'appel dynamique sur Wikipédia et je ne pouvais pas comprendre la différence entre l'appel dynamique et la liaison tardive en C++.

Quand chacun des mécanismes est-il utilisé?

La citation exacte de Wikipédia:

L'appel dynamique est différent de la liaison tardive (aussi connue sous le nom de 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 fait référence au choix d'une implémentation pour l'opération après avoir décidé à quelle opération se réfère un nom. Avec l'appel dynamique, le nom peut être lié à une opération polymorphe au moment de la compilation, mais l'implémentation ne sera pas choisie avant l'exécution (c'est ainsi que fonctionne l'appel dynamique en C++). Cependant, la liaison tardive implique l'appel dynamique puisque vous ne pouvez pas choisir quelle implémentation d'une opération polymorphe sélectionner tant que vous n'avez pas sélectionné l'opération à laquelle le nom se réfère.

63voto

WhozCraig Points 32734

Une réponse assez décente à cela est en fait incorporée dans une question sur la liaison tardive vs précoce sur programmers.stackexchange.com.

En bref, la liaison tardive se réfère au côté objet d'un eval, le dispatch dynamique se réfère au côté fonctionnel. Dans la liaison tardive, le type d'une variable est le variant à l'exécution. Dans le dispatch dynamique, c'est la fonction ou la sous-routine en cours d'exécution qui est le variant.

En C++, nous n'avons pas vraiment de liaison tardive car le type est connu (pas forcément la fin de la hiérarchie d'héritage, mais au moins une classe de base ou une interface formelle). Mais nous avons bien du dispatch dynamique via les méthodes virtuelles et le polymorphisme.

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

Dim obj

- initialiser l'objet puis..
obj.DoSomething()

Le compilateur code en réalité le contexte d'exécution approprié pour le moteur d'exécution afin d'effectuer une recherche nommée de la méthode appelée DoSomething, et si découvert avec les paramètres correspondants, exécute effectivement l'appel sous-jacent. En réalité, quelque chose concernant le type de l'objet est connu (il hérite de IDispatch et prend en charge GetIDsOfNames(), etc), mais du point de vue du langage, le type de la variable est complètement inconnu au moment de la compilation, et il n'a aucune idée si DoSomething est même une méthode pour quelque chose que obj est en réalité jusqu'à ce que l'exécution atteigne le point d'exécution.

Je ne vais pas me donner la peine de vous inonder d'une interface virtuelle C++ et cetera, car je suis sûr que vous savez déjà à quoi elles ressemblent. J'espère qu'il est évident que le langage C++ simplement ne peut pas faire cela. Il est fortement typé. Il peut (et le fait, évidemment) faire du dispatch dynamique via la fonctionnalité de méthodes virtuelles polymorphiques.

8voto

Yochai Timmer Points 19802

La liaison tardive consiste à appeler une méthode par son nom pendant l'exécution. Vous n'avez vraiment pas cela en c++, sauf pour l'importation de méthodes à partir d'une DLL.
Un exemple pour 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 est généralement fait en créant une table virtuelle.

8voto

M M. Points 29201

Le lien lui-même explique la différence :

La délégation dynamique est différente de la liaison tardive (aussi connue sous le nom de 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 délégation consiste à choisir une implémentation pour l'opération après avoir décidé de quelle opération un nom fait référence.

et

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

Mais ils sont principalement égaux en C++ vous pouvez réaliser une délégation dynamique avec des fonctions virtuelles et des tables virtuelles.

En C++, on utilise la liaison tôt et on propose à la fois une délégation dynamique et statique. La forme par défaut de délégation est statique. Pour obtenir une délégation dynamique, vous devez déclarer une méthode comme virtuelle.

5voto

Nawaz Points 148870

En C++, les deux sont identiques.

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

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

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

En utilisant la liaison dynamique, C++ prend en charge le polymorphisme en temps d'exécution à travers les fonctions virtuelles (ou pointeurs de fonction), et en utilisant la liaison statique, tous les autres appels de fonctions sont résolus.

5voto

bhupinder Points 120

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

La chose principale ici est les paramètres de fonction, ceux-ci décident quelle fonction appeler à l'exécution.

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

dispatcher le contrôle en fonction de la correspondance des paramètres

http://fr.wikipedia.org/wiki/Dispatch_dynamique

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