9
votes

Delphi: Quels sont les inconvénients des unités inutilisées énumérées dans la clause utilisée?

J'utilise cnpack utilise un nettoyant , mais en général qui sont les les inconvénients d'avoir des unités inutiles?

Je connais certains d'entre eux:

1) Bien sûr, si l'unité n'est jamais utilisée dans le projet complet, il y aura une consommation de ressources inutile

2) La perspicacité du code donnera des résultats inutilement

3) Le code de code sera plus lent

mais imaginez un cas simple:

  • J'ai un projet avec 2 formes, j'utilise des strutils dans l'une d'entre elles, mais j'ai déclaré des strutils dans les deux ... Y a-t-il des inconvénients dans les températures de la consommation de mémoire dans ce cas ou non?

1 commentaires

CodeInSight est une fonctionnalité vraiment drôle, alors oui, il est préférable de ne pas le déranger à moins que nécessaire. Sinon, les effets sont négligeables.


3 Réponses :


7
votes

Delphi Smart Linker ignorera le code inutilisé afin que la présence de ces unités "supplémentaires" n'augmente pas la taille du programme compilé.

Voici quelques points que je reçois de Ce lien sur les inconvénients des unités inutilisées

  1. Code de nettoyage à maintenir, pas besoin de vous embêter sur le code qui n'est pas utilisé
  2. Code des sections d'initialisation et de finalisation dans des unités inutilisées n'est pas liée dans
  3. La compilation fonctionne plus douce et plus rapide

1 commentaires

+1 pour la maintenabilité. Particulièrement utile lors de la dépannage des bogues qui se produisent lors de l'initialisation. Le temps passé à regarder des unités inutilisées est gaspillé de temps.



15
votes

non. En général SmartLinking fonctionne comme ceci:

  • Si vous utilisez une unité quelque part, au moins le code Inialization et finalisation est lié à.
  • En principe, seules les fonctions / méthodes que vous utilisez réellement, directement ou indirectement à partir du programme principal (.DPR) sont liés.
  • Certains bits accessibles via RTTI seront également liés. La règle de gézantique est que RTTI pour Enums est toujours liée dans (si vous utilisez l'ENUM), et que (dès que vous construire une classe), tout publié ou accessible via des propriétés publiées est lié à.
  • Gardez à l'esprit que l'initialisation d'unités inutilisées pourrait tirer dans dlls ou même des cadres entières de DLL (comme .NET) qui pourrait constituer une complication inutile de réapprovisionnement.
  • (comme Rob dit dans les commentaires) Ressources sont un autre facteur toujours lié dans, car en raison de leur utilisation d'exécution, le compilateur ne peut pas déterminer si elles sont utilisées ou non.
  • dans les DLL ou les projets d'emballage, tous les symboles publiés seront liés, car un programme externe pourrait les appeler.

    Conclusion: la dernière taille .exe est déterminée

    • principalement par tout ce qui est accessible par des racines ci-dessus (principalProgramme, initialisation, finalisation, RTTI des classes qui peuvent être construites),
    • Certains bits qui sont toujours liés si l'unité est utilisée (ressources, certaines formes de RTTI comme Enums),
    • Aides de langue dans la RTL, comme des routines d'assistant de distribution, la plupart d'entre elles sont dans le système, certaines pourraient être en variantes.
    • Quelques petites Administration du programme interne (E.G. Tables avec des unités qui déterminent l'ordre d'initialisation / finalisation), Tables nécessaires à la manipulation de ressources, à la liaison DLL, etc.
    • info de débogage (si TD32 sur)
    • Paramètres du compilateur Comme l'optimisation et les vérifications d'exécution sont également légèrement influencer la taille binaire.
    • La compression binaire utilise comme UPX. Je Ne recommande pas Celles-ci, car dans mon expérience, ils causent constamment des problèmes.

      Free Pascal fonctionne grossièrement de la même manière, les valeurs par défaut sont simplement différentes; Débogage est actuellement presque toujours "en binaire" (comme TD32) et dans les instantanés, SmartLinking est désactivé par défaut. (Dans les versions officielles, c'est sur).

      En outre, il ne faut pas perdre de vue la magnitude. Strutils dans son intégralité est comme 15kb max.

      (mise à jour 2011-11-01)

      Vous avez obtenu une remarque de SB sur cette réponse, j'ai aimé partager:

      En gros, il a mis en doute sur la remarque que les énums sont toujours liées. Peut-être que l'enregistrement d'une classe qui a une propriété publiée du type ENum les dragose. Le raisonnement a du sens, mais je ne l'ai pas encore testé. Donc, RTTI de Enum peut être uniquement lié si TypeInfo (tenualtype) est interrogé quelque part ou s'il est utilisé dans une section publiée de la classe utilisée. (directement ou TypeInfo (Theclass) est interrogé)


5 commentaires

Des problèmes de mémoire de côté, le compilateur doit résoudre ces dépendances avant qu'il ne puisse les abattre. Mais le vrai problème est l'encombrement de vous distraire de voir ce qu'une unité utilise vraiment.


Je n'ai pas parlé de la destinaçabilité de la source et de compiler la vitesse de ne pas confondre la discussion. Dans le cas de Strutils une initialisation oubliée n'est pas mauvaise, mais certaines unités pourraient tirer dans des DLL dans l'initialisation, que vous devez ensuite déployer et gérer (dans l'installateur).


En outre, dans l'exemple donné dans la question, je pense qu'il n'y aurait essentiellement aucune différence de taille de la mémoire (moins de 50 octets, je suppose?) Depuis que l'unité est déjà utilisée par une autre unité du projet.


Dans ce cas, zéro. (Sauf si 2010+ RTTI change cela)


Les fichiers de ressources sont également inclus simplement à l'aide d'une unité, même si vous n'utilisez aucun code de l'unité. (C'est le but entier de la composante TXPManifest, d'apporter dans l'unité XPMAN, qui relie la ressource manifeste par défaut. Le composant lui-même ne fait rien, mais la mise sur une forme permet à l'IDE ajouter l'unité à votre projet.)



5
votes

Le plus gros problème, à mon esprit, est que vous pouvez parfois être pris de sorte par les règles de décomposition Delphes. Si vous avez deux identifiants avec le même nom dans différentes unités, vous utilisez ce nom, il fait référence à celui déclaré dans l'unité déclarée la plus tard dans la clause Utilisations.

Si vous souffrez d'un problème, vous pouvez toujours préciser complètement l'identifiant. Ce que j'aimerais vraiment voir, ce serait des avertissements du compilateur pour vous dire si vous nommez un identifiant dont l'identité n'est déterminée que par cette Dernière déclaration de la clause Utilisations Clause Scoping Rule.


0 commentaires