2016-10-09 3 views
-2

J'ai quelques questions à propos de C++/CLR C++ Interop (mélangeant essentiellement du code non géré et géré C++).C++/CLR (C++ Interop) Questions de base :)

  1. Si je crée une application avec C++/CLR et j'écris non géré et le code managé, par exemple:

    int main(int argc, char*argv[]) 
    { 
        int a = 30;         
        int* a_ptr = &a;        
        std::cout << a_ptr << std::endl;    
        Console::WriteLine("This is managed code"); 
    } 
    

Comme la 4ème ligne est géré code .NET, il sera à travers le CLR. Mais les trois premières lignes passeront-elles aussi par le CLR ou seront-elles traitées séparément? Est-ce que cela réduira les performances si j'écris uniquement du code non géré C++ dans un projet CLR?

  1. Est-ce que le C++/projet CLR changer quoi que ce soit dans le langage C++, par exemple les primitives ou des trucs comme ça?

  2. Comment ça marche? Comment le CLR est-il appelé s'il détecte qu'une commande l'utilise ... ou est-ce que tout passe par là?

+1

Une question par question s'il vous plaît. Et un titre significatif. –

+0

@qxz: "sth" est l'abréviation de "something", pas "stuff". –

+0

Il passe par le compilateur juste-à-temps. Ce qui convertit le MSIL que le compilateur a généré de votre fonction main() en code machine. Rien de radicalement différent de ce qu'un compilateur normal fait, ils utilisent tous un frontal qui analyse le code et le transforme en IL et un back-end qui génère du code machine. Comparez avec LLVM. La seule différence est que cette étape de traduction IL se produit à l'exécution au lieu de la compilation. –

Répondre

0
  1. No. Performance sera le même. En C++ CLI, une fonction peut être gérée ou non gérée. Et quelle que soit la fonction gérée ou non, ils sont égaux au processeur après avoir été mis en veille. Ainsi, un appel de la fonction native à la fonction gérée n'est pas si différent de celui de la gestion natif-> natif, géré->. La seule grande différence se produit lors du passage des paramètres. Selon le cas, certains paramètres sont rassemblés d'un monde à l'autre. Si cela arrive, vous perdez alors de la performance. (Même chose avec les valeurs de retour). Dans votre exemple, il n'y a pas de paramètre cross world qui passe ou qui revient, donc il n'y a pas de performance.

  2. Non. Tout reste identique. De géré à non géré, il utilise le mécanisme de demande interne tout comme le CLR lui-même. De géré à non géré, il appelle simplement l'adresse. La fonction native ne se soucie pas si elle appelle un code managé ou non (sauf le marshaling des paramètres).