Deux petits exemples banals de piles génériques sur la base d'un type T, dont la capacité est déterminée de manière statique, donc à la compilation.
Le premier exemple alloue dynamiquement la zone mémoire dans laquelle la gestion des éléments de la pile sera faite. Cette approche est idéale en général, surtout lorsque les valeurs de N sont « grandes ». Entendu ici que « grande » est quelque peu subjectif : ce que nous souhaitons est éviter que la véritable pile d'exécution du thread utilisant une instance de cette classe ne soit débordée par l'espace que l'instance en question occupera – ici, en allouant dynamiquement ce vers quoi mènera p_, on garde l'espace occupé par une instance de Pile<T,N> sur la pile d'exécution approximativement à la hauteur de sizeof(T*)+sizeof(int), ce qui est tout petit. Je vous invite à les raffiner (ajouter la sémantique de copie et la sémantique de mouvement, en particulier). |
|
Le deuxième exemple se prête à de « petites » valeurs de N (et à de petits T), et peut être économique en temps d'exécution du fait qu'elle ne requiert pas la gestion de mémoire allouée dynamiquement. |
|
Si vous souhaitez une seule classe Pile<T,N> qui soit capable de choisir son implémentation sous-jacente parmi les deux ci-dessus à partir de sizeof(T) et de N, donc qui utilise la version sans allocation dynamique de mémoire pour de « petits » N*sizeof(T) et qui utilise la version avec allocation dynamique de mémoire lorsque N*sizeof(T) passe un certain seuil, voici comment procéder.
En gros, voici comment procéder :
J'utilise une alternative statique, std::conditional, pour implémenter le choix de type d'implémentation. Pour en savoir plus à ce sujet, je vous invite à lire l'article sur la métaprogrammation du présent site. |
|
Qu'en pensez-vous?