Qu'entend-on par "instanciation différée" dans les modèles C++?Modèle C++ "instanciation différée"
Répondre
L'instanciation différée est lorsque le modèle n'est pas instancié jusqu'à ce que l'entité correspondante soit utilisée pour la première fois. Par exemple, vous avez une fonction templated:
template<int Size>
void YourFunction()
{
//does something
}
paramètre Size
peut avoir une valeur possible que int
peut avoir. Avez-vous automatiquement la fonction template instanciée pour toutes les valeurs possibles de Size
? Non, le modèle est seulement instancié pour les valeurs qui sont effectivement utilisées comme paramètre lorsque l'appel de fonction apparaît d'abord dans le code:
YourFunction<100>(); //instantiated for 100
Je n'ai entendu des gens utilisent le terme « instanciation différée » pour désigner la situation où une définition de membre de la classe est instanciée seulement si elle est utilisée
template<typename T>
struct A {
void f() {
T a; // invalid if T is void
}
};
A<void> a; // valid!
Dans ce cas, A<void>
est instancié implicitement parce que le compilateur a besoin de connaître sa taille (formellement, le type de classe doit être complète, donc une instanciation est déclenché). Mais l'instanciation de ses définitions de membre sont différées jusqu'à ce qu'elles soient réellement utilisées. Cela ne vaut pas seulement pour les fonctions membres, mais aussi aux membres de données statiques et classes imbriquées
struct Print {
Print() { std::cout << "hello!"; }
};
template<typename T>
struct A {
static Print print;
};
template<typename T>
Print A<T>::print;
Maintenant, même si vous implicitement instancier A<T>
le message ne sera pas imprimé jusqu'à ce que vous faites référence explicitement à A<T>::print
et utilisation il . L'instanciation explicite ne différer instanciation des définitions membres - donc ce qui suit toujours imprimer le message
template struct A<void>;
Il y a une astuce pour déclencher instanciation des définitions membres pour instanciations implicites si: Se référer à eux dans certaines parties de la déclaration d'une classe «membre, comme dans le modèle de classe changé suivant
template<typename T, T&> struct useit { };
template<typename T>
struct A {
static Print print;
typedef useit<Print, print> useit_type;
};
maintenant, si A<T>
est implicitement instanciée le message est imprimé, parce que la déclaration typedef fait référence.
- 1. C++ modèle implicite instanciation
- 2. C++ instanciation de modèle ambigu
- 3. Instanciation de modèle C++ avec argument d'identité
- 4. Exécution différée en C#
- 5. ASP.Net utilisateur contrôle Modèle instanciation
- 6. méthode usine retour une instanciation concrète d'un modèle C++ classe
- 7. C modèles ++: éviter instanciation du modèle de base de
- 8. Confus au sujet de modèle implicite instanciation
- 9. Problème gcc avec instanciation de modèle explicite?
- 10. Instanciation au niveau global (C++)
- 11. Crash Instanciation System.Xml.Serialization.XmlSerializer en C#
- 12. instanciation explicite
- 13. Opérateur de modèle << instanciation explicite et en-tête
- 14. Instanciation d'objets dans la mémoire partagée C++
- 15. instanciation composant COM en C# - Erreur 80070002
- 16. inspecter l'instanciation du modèle C++
- 17. Obtention d'un type pour une instanciation de modèle?
- 18. modèle de registre et instanciation paresseuse des objets enregistrés
- 19. (initialisation statique/instanciation de modèle) problèmes avec motif d'usine
- 20. Linq exécution différée
- 21. vérification de contrainte différée
- 22. Exécution différée et évaluation avide
- 23. Instanciation de modèle explicite avec la fonction de modèle de membre
- 24. délégué instanciation -Clarification
- 25. Instanciation Ext.form.CompositeField
- 26. instanciation javax.servlet.ServletException
- 27. Instanciation d'objets
- 28. MSVC: Instanciation de modèle implicite, bien que le constructeur de modèle ne soit pas utilisé
- 29. Différence entre l'exécution différée et l'évaluation paresseuse en C#
- 30. DirectShow Capture avec lecture différée
+1. J'aime le suspense que vous ajoutez en posant des questions ;-) –
La raison pour laquelle ceci est important: imaginez une ligne 'const int nombre = 100/Size;'. Il ne devrait pas générer d'erreur jusqu'à ce que quelqu'un essaie d'utiliser 'YourFunction <0>'. – MSalters
@MSalters: Oui, ça aussi. Mais imaginez aussi que le compilateur essaie d'instancier cette fonction pour chaque valeur possible de 'int' - ce serait beaucoup de données intermédiaires. – sharptooth