2010-10-27 6 views
3

J'ai une question assez basique.Frais généraux de la DLL

  1. Lorsqu'une bibliothèque est utilisée uniquement par un seul processus. Devrais-je le garder comme une bibliothèque statique?
  2. Si j'utilise la bibliothèque en tant que DLL, mais qu'un seul processus l'utilise. ** Quel sera les frais généraux? *

Répondre

10

Il est presque pas de frais généraux d'avoir une DLL séparée. Fondamentalement, le premier appel à une fonction exportée à partir d'une DLL exécutera un petit bout qui fixe les adresses de fonction de sorte que les appels ultérieurs sont effectués via un seul saut à travers une table de saut. Le fonctionnement des processeurs, cette indirection supplémentaire est pratiquement gratuite.

Le "surcoût" principal est en fait un coût d'opportunité, pas un "surcoût" en soi. C'est-à-dire que les compilateurs modernes peuvent faire quelque chose appelé «optimisation de programme complet» dans laquelle le module entier (.exe ou .dll) est compilé et optimisé en même temps, au moment de la liaison. Cela signifie que le compilateur peut faire des choses comme ajuster les conventions d'appel, les fonctions inline et ainsi de suite à travers tous les fichiers .cpp dans le programme entier, plutôt que juste dans un seul fichier .cpp.

Cela peut entraîner une augmentation des performances assez agréable, pour certains types d'applications. Mais bien sûr, l'optimisation du programme entier ne peut pas se produire à travers les limites de la DLL.

+0

Ce n'est pas tout à fait vrai, dans le cas habituel, les adresses de fonction sont fixées au fur et à mesure que le programme est chargé, pas au moment de l'exécution. Le commentaire sur l'optimisation du programme entier est mort, mais je n'ai vu aucune information sur son utilité. –

+0

@Mark: Oui, je pense peut-être à des DLL chargées en retard ... dans tous les cas, le surcoût lui-même est faible dans les deux cas ... –

1

Les fonctions importées n'ont pas plus de surcharge que les fonctions virtuelles.

3

Il y a deux surdébits dans une DLL. Tout d'abord, lorsque la DLL est chargée en mémoire, les adresses internes doivent être corrigées pour l'adresse réelle à laquelle la DLL est chargée, contrairement aux adresses prises en charge par l'éditeur de liens. Cela peut être minimisé en re-basant les DLL. Le deuxième surcoût est lorsque le programme et DLL sont chargés, comme les appels de programme dans la DLL ont les adresses des fonctions remplies. Ces frais généraux sont généralement négligeables, sauf pour les très grands programmes et DLL.

Si cela vous préoccupe, vous pouvez utiliser des DLL chargées en différé qui ne sont chargées que lorsqu'elles sont appelées. Si la DLL n'est jamais utilisée, par exemple, elle implémente une fonction très rare, alors elle ne sera jamais chargée du tout. L'inconvénient est qu'il y a un court délai la première fois que la DLL est appelée. J'aime utiliser des bibliothèques liées statiquement, pas pour réduire la surcharge mais pour minimiser les tracas d'avoir à conserver la DLL avec le programme.

Questions connexes