Question

Je suis depuis longtemps C # et .Net développeur, et je joue avec l'idée de l'apprentissage c ++.

L'une des principales raisons que je l'ai pensé à ce sujet, est ainsi beaucoup plus rapide C ++ peut être sur des applications utilisant le framework .Net. Mais suis-je raison de supposer que si j'écris un C ++ application dans Visual Studio, et / ou référence des bibliothèques .Net dans une application C ++, que C ++ est converti en MSIL (comme C #) - et à cet effet, je perdriez tout avantage du codage en elle?

Donc, ma question est la suivante: sont les composants de C d'une application faisant référence ensembles .Net compilés dans la manière « traditionnelle » ou comiled dans MSIL

Était-ce utile?

La solution

Eh bien, il est un peu plus compliqué que cela. Il y a en fait deux versions totalement différentes de C-++ .NET soutien.

L'ancien, les extensions gérées pour C ++, était la seule option disponible dans Visual C ++ 2002/2003. Il est disponible dans de nouveaux compilateurs sous l'option / clr: oldSyntax. Il est un peu maladroit comme il essaie difficile d'intégrer à la norme C ++, de sorte que tous les nouveaux mots-clés (et il y a beaucoup d'entre eux) sont préfixées avec double underscores, etc. Le code généré par ce compilateur est un mélange de code natif et MSIL, surnommé IJW « il fonctionne tout simplement ».

Le nouveau, appelé C ++ / CLI, est une nouvelle langue propre disponible dans Visual C ++ 2005 et plus récent. Plus important encore, il prend en charge plusieurs modes de génération de code. L'option / clr génère à nouveau un mélange de IJW de code natif et MSIL. / Clr: résultats purs dans une seule assemblée géré, bien qu'il puisse traduire les types natifs dans les structures correspondantes de .net. Le code ne peut donc pas être de sécurité type et peut utiliser l'arithmétique des pointeurs, à peu près comme C # avec / dangereux. Et la plus stricte des options est / clr:. Sûr, qui produit de type sécurisé, vérifiable MSIL seule assemblée, exactement comme compilateur C # ne (sans / risque, qui est)

Pour les différences entre MC ++ et C ++ / CLI, consultez le wikipedia .

Pour une description des commutateurs du compilateur, voir MSDN .

PS. L'octet de code .NET est appelé soit MSIL (Microsoft Intermediate Language) ou CIL (Common Intermediate Language). MIL peut se présenter à la couche d'intégration des médias, la bibliothèque de bas niveau sans papier utilisé par WPF et Vista Desktop Manager fenêtre.

Autres conseils

Il est probablement une bonne idée de garder les concepts séparés.

D'abord, C ++ est un langage, et il ne précise rien sur ce que la plate-forme devrait être ciblée. En principe, le code C ++ droit peut être compilé pour x86 natif assembleur, bytecode Java, MSIL ou tout ce que vous souciez de penser. Je crois que Adobe a récemment fait un compilateur C ++ qui génère bytecode flash.

En second lieu, avec irrésolution typique, Microsoft a créé deux C ++ - langages dérivés ciblant .NET. Tout d'abord, ils ont fait les « extensions gérées pour C ++ ». Ensuite, ils ont décidé qu'il suçait, et abandonné a essayé de prétendre qu'il n'a jamais existé.

Maintenant, leur meilleur pari pour le style .NET C ++ est appelé C ++ / CLI, mais il n'est pas C ++ . Il prolonge et modifie la langue dans un certain nombre de façons non standard. (Et je crois que le comité C standard de demande qu'ils changent le nom pour éviter toute confusion. Mais ils ne)

Visual Studio 2005 et plus récents supports C ++ / CLI. (Dans "Ajouter un projet", ils sont répertoriés sous Visual C ++ -> CLR)

Cependant (vous ne pensiez pas que ce soit aussi simple que cela, avez-vous?), Microsoft a fait à nouveau. Après avoir spécifié C ++ / CLI, qui est en fait une tentative raisonnablement bien conçue à intégrer C ++ avec CLI, ils ont réalisé que pratiquement personne ne l'utilise! Avère que même les programmeurs C ++ préfèrent généralement utiliser C # quand ils travaillent dans .NET, et bon, C ++ natif autrement.

Alors maintenant, ils se concentrent sur faire Interop entre natif C ++ et .NET plus simple et plus puissant. Cependant, C ++ / CLI ne risque pas de disparaître. Il fonctionne, et dans certains cas, il est utile. Il est tout simplement pas le C ++ -. Tueur ils espéraient à l'origine pour

Visual Studio (depuis toujours) supporte également les applications C ++ natif, compilé en code machine x86, inaltérée avec .NET. Ceux-ci sont répertoriés dans la boîte de dialogue "Ajouter un projet" sous Visual C ++ -.> Win32

Donc, si vous voulez apprendre le C ++, vous avez deux choix: En savoir C ++ / CLI, qui vous limite à une langue MS seule qui oui, génère MSIL au lieu du code machine natif et nécessite .NET pour exécuter, et est généralement ne vaut pas la peine parce que si vous allez prendre une dépendance sur .NET de toute façon , pourquoi ne pas écrire en C #?

Ou apprendre C ++ bon, ce qui est complètement séparé de .NET et ne peut pas référencer directement des assemblages .NET.

Le point clé de plats à emporter est qu'ils sont des langues distinctes. Soit vous compilez en C ++ / CLI, ce qui signifie que le compilateur vous permettra de référencer les assemblies .NET, et générer du code MSIL ou de la compilation en C ++, auquel cas le monde .NET n'existe pas.

Et enfin, une note de prudence. En dépit de mon libellé ci-dessus ( « bon C ++ » et « viciée par .NET »), C ++ n'est pas « meilleur ». Dans de nombreux cas, il est plus rapide non plus. C ++ a le potentiel pour être plus rapide, mais cela dépend beaucoup plus du programmeur.

Le compilateur C # va tourner quoi que ce soit à peu près dans le code raisonnablement efficace. C ++ d'autre part, est plein d'embûches qui feront de votre code plus lent que l'équivalent C #.

http://blogs.msdn.com/ricom/ archives / 2005/05/10 / 416151.aspx et les messages de blog, il références valent pour toute personne curieuse au sujet de la performance du code similaire écrit dans les deux langues.

Il n'y a qu'un seul domaine où les applications C seront toujours plus vite, et qui est dans le temps de démarrage. une application .NET peut avoir à charger le framework .NET et JIT le code MSIL, où une application native ... commence juste.

Mais à part ça, il est probablement une erreur de supposer que sera plus rapide C ++. Il peut être, car il vous donne un peu plus de contrôle. Mais en général, cela signifie que le compilateur est moins en mesure de vous faire économiser des inefficacités que vous créez dans votre code.

Cette est un assez bon (si daté) de discussion géré vs non géré C ++.

Dans une coquille de noix, C ++ peut être soit géré (compilé à la norme MIL) ou non gérés (compilé en code natif).

Quelles que soient vos raisons de vouloir apprendre le C ++, il est toujours bon de savoir plusieurs langues, car il élargit votre esprit si l'apprentissage C ++ est une leçon précieuse en elle-même.

Avec C ++, vous pouvez l'exécuter comme une application .NET C ++ / CLI ou natif. Il est juste un commutateur de compilateur dans Visual Studio mais il y a beaucoup de différences de syntaxe entre les deux. Personnellement, je pense l'apprentissage des deux saveurs est utile.

Lequel choisir dans vos projets dépend un peu sur les besoins par exemple si votre programme a besoin d'interagir d'autres modules gérés comme des modules écrits en C #, il est préférable d'utiliser C ++ / CLI pour éviter une commutation entre les frais généraux du code managé et non géré.

Les composants C ne peuvent pas de référence facilement des assemblages .Net (vous devez utiliser COM). Managed C ++ est compilé dans CIL et a le même profil de performance à C #.

C ++ est d'environ 10% plus rapide pour le même niveau de optomization pour la plupart du code cependant C # prend la moitié du temps d'écrire et de débogage ainsi pour la même quantité de temps, je dirais que les optomizations vous pouvez mettre en place rendrait C # plus rapide. ..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top