J'adore C # car les fonctionnalités puissantes du .NET Framework le rendent si facile à développer pour Windows. Cependant, j'adore aussi la standard C ++ principalement parce que cela me donne un contrôle réglé sur la gestion de la mémoire. Y a-t-il un moyen d'avoir le meilleur des deux mondes? Existe-t-il des bibliothèques C ++ pouvant être concurrentielles avec le riche ensemble de bibliothèques dans la framework .NET? Ou existe-t-il un moyen de négocier manuellement la mémoire dans l'une des langues .NET que je n'ai jamais utilisées? Ou est-il possible d'utiliser une DLL .NET dans une application C ++ standard? Je sais, je t'écrit vraiment ici, mais je crois en la magie. p>
8 Réponses :
Y a-t-il des bibliothèques C ++ qui peuvent rivaliser avec le riche ensemble de bibliothèques dans le cadre .NET? P> blockQuote>
QT se vient à l'esprit immédiatement, mais je doute que ce soit aussi riche que la bibliothèque .Net. P>
Y a-t-il un moyen de distribuer manuellement mémoire dans l'une des langues .NET que je n'ai jamais utilisé? p> blockQuote>
La réponse à ceci est oui et non, il existe certaines méthodes dans .NET pour prendre le contrôle de la mémoire. Il y a
faibles références , des références fortes, (sorte de ) Collection ordures forcée , etc. Mais ces choses sont déjà discutées dans d'énormes détails ici. p> Voici quelques détails sur la manière dont la gestion de la mémoire fonctionne en .NET. P>
Généralités et générations
meilleures pratiques de forçage de GC in .NET
mieux encore, lisez les liens dans cette requête de recherche P>est-il possible d'utiliser une dll .NET dans un application C ++ standard? P> blockQuote>
Oui, vous pouvez générer un wrapper COM / wrappers non gérés pour .NET DLL et peut l'utiliser dans des applications C ++. P>
Vous pouvez utiliser le projet .NET DLL dans le projet C ++ via COM ou vous pouvez héberger CLR et interagir avec des entités CLR, ce serait un codage assez encombrant, mais oui c'est possible. Réglage COM Visible True fait .NET Object accessible via COM dans VB / MFC. P> LI>
.NET contient peu de méthodes de collecteur de déchets que vous pouvez exécuter explicitement pour collecter des graisses, planalement qu'il dispose d'intrface idéal que vous pouvez utiliser pour disposer de vos membres en classe et avec "Utilisation" de mot-clé, vous pouvez expliciter expliciter la méthode à la fin de l'utilisation d'exemple présenté ci-dessous. p> li>
using(FileStream fs = File.OpenRead("xyz.txt"){ fs.Read(buff,0,100); } // here fs gets closed in dispose //method automatically...
Vous pouvez invoquer le code non géré du code géré (via Pinvoke) et invoquer le code géré du code non géré (comme une sorte d'objet COM). P>
Avez-vous regardé boost ? p>
Alternativement, vous peut em> utiliser "C ++ / CLI" (A.k.a. géré C ++, a.k.a. C ++. NET); Le code écrit dans cette langue peut appeler des API .NET et peut également gérer manuellement la mémoire via des API Win32 traditionnelles telles que heaphoc code> /
heapfree code>. Dans mon expérience, cependant, cette langue est la plus fréquemment utilisée pour écrire "code de colle", et non pour créer des applications de la masse. P>
+1 pour C ++ / CLI. (Je n'ai ajouté que la période parce que les commentaires doivent avoir 15 caractères, il suffit de penser que vous aimeriez savoir que. Maintenant, avec ce commentaire, sa façon de plus de 15 caractères)
(J'ajoute des espaces pour avoir besoin d'obtenir au-dessus de ce minimum de charcuter :-))
Nope, gérée C ++ a été une expérience échouée et n'est pas compatible avec la source avec C ++ / CLI. Cependant, étant donné que les deux sont des langues ciblant le fichier CLR .NET, ils sont compatibles binaires. (Mais les vb.net et c #)
Vous pouvez également "broder" segments de code en C #, si vous voulez vraiment avoir des pointeurs d'accès explicites et tels ( de msdn ): mais vraiment, je pense que vous préférez déterminer pourquoi spécialement vous cherchez Pour gérer vous-même la mémoire - la plupart des développeurs que je sais à ce stade se concentreraient plutôt sur la conception et la construction de systèmes, plutôt que de se soucier de négocier les morceaux de mémoire. Il y a d'autres bonnes suggestions ici, telles que Boost (bien que honnêtement, si vous avez les cajones pour annoncer que vous êtes meilleur que le GC, vous êtes probablement déjà au courant de Boost), QT et .NET Bridging (enfer, Vous pouvez héberger le CLR dans un processus non géré, si vous le souhaitez), mais je soupçonne que pour les quelques endroits où il vous incombe réellement à gérer vous-même de la mémoire vous-même, vous serez bien mieux de les contraindre à un projet VC ++ référencé par le reste de votre solution. P> p>
Un avantage de C ++ est que lorsque vous annouez une mémoire, vous savez qu'il est parti et qu'une erreur tangible se produira si quelque chose essaie à nouveau d'accéder à nouveau à cette mémoire. Avec le collecteur des ordures, un objet ne peut pas être distribué du tout, car un autre objet inconnu lui fait référence, ce qui entraîne une fuite de mémoire subtile sans erreur. Donc, dans ce cas, il peut effectivement être plus difficile de déboguer une fuite de mémoire parce que le collecteur des ordures décida d'être un peu trop intelligent.
Cependant, je vais admettre que votre point de ne pas avoir à vous soucier de la gestion de la mémoire est extrêmement valable pour la plupart des situations.
STL + BOOST + QT est une concurrence solide pour C # et .NET. p>
Je devais travailler sur une application Compact Framework récemment et j'ai été déçu de la manière WinForms par rapport aux mises en page faciles de QT. Le modèle d'élimination était également très gênant, il n'était pas clair que les ressources nécessaires à leur élimination et qui ne l'ont pas fait, donc j'ai fini par googler pour ce qui est sûr d'appliquer en utilisant () sur. P>
à mon avis, Manipulation des ressources non gérées est plus compliqué que c ++ 's Raii. P>
Voici une raison pour laquelle vous auriez besoin de NO-GC .NET; Développer des jeux Xna sur WP7 ou les comprimés Win8 à venir. Si vous ne faites pas attention à l'allocation d'objet, GC crée vraiment une expérience de jeu agitée car elle frappe périodiquement. Il existe des façons de faire la mise en commun des objets, etc. Cependant, vous n'avez pas de contrôle sur tous les objets créés. Il n'y a donc aucun objet de garantie passera par le même mécanisme de mise en commun. Je peux imaginer un mode spécial de GC qui suspend la collection jusqu'à ce que vous le disiez de continuer. Dans le mode NO-GC, il ne ferait aucune collection, mais elle réutiliserait la mémoire qui est libérée par des objets plutôt que d'attendre la collecte en premier. À peu près comme C ++ Memory Manager. Cela pourrait le faire en vérifiant si la zone de mémoire d'un objet doit être mise à la disposition immédiate. Je suis sûr que ce sera plus difficile de le mettre en œuvre que ce que je décris ici, mais cela vaut la peine d'avoir cette fonctionnalité afin que les développeurs .NET soient habilités au développement en temps réel comme des jeux. P>
Je pense que vous chassez le mauvais objectif. Toutes les bibliothèques .NET dépendent du GC, alors pour la mémoire, vous ne pourrez pas vraiment vous en sortir. Je vous recommanderais d'apprendre les méthodes idiomatiques C # de la mise en œuvre de techniques RAII pour autre chose que la mémoire (Idisposable, en utilisant). C # est une langue puissante.
Vous n'avez pas vraiment expliqué pourquoi vous voudriez abandonner le GC - je pense que la plupart d'entre nous diraient que la GC était une chose bonne i>.
Un avantage de C ++ est que lorsque vous annouez une mémoire, vous savez qu'il est parti et qu'une erreur tangible se produira si quelque chose essaie à nouveau d'accéder à nouveau à cette mémoire. Avec le collecteur des ordures, un objet ne peut pas être distribué du tout, car un autre objet inconnu lui fait référence, ce qui entraîne une fuite de mémoire subtile sans erreur. Donc, dans ce cas, il peut effectivement être plus difficile de déboguer une fuite de mémoire car le collecteur des ordures était un peu trop intelligent.
@Phil: Vous dites qu'en C ++, "lorsque vous annouez de la mémoire ... une erreur tangible se produira si quelque chose essaie à nouveau d'accéder à nouveau à la mémoire." Je ne crois pas que ce soit vrai: n'est-ce pas utile - sans fabrique comportement non défini i>? Je peux penser à de nombreuses façons d'être des erreurs subtiles avec une mémoire gérée manuellement, et la plupart d'entre elles offrent des conséquences bien pistiques qu'une fuite de mémoire.