CFixedStringT : exemple de gestionnaire de chaînes personnalisé
La bibliothèque ATL implémente un exemple de gestionnaire de chaînes personnalisé utilisé par la classe CFixedStringT, appelée CFixedStringMgr. CFixedStringT
est dérivé de CStringT et implémente une chaîne qui alloue ses données de caractères dans le cadre de l’objet CFixedStringT
lui-même tant que la chaîne est inférieure à la longueur spécifiée par le t_nChars
paramètre de modèle de CFixedStringT
. Avec cette approche, la chaîne n’a pas besoin du tas du tout, sauf si la longueur de la chaîne augmente au-delà de la taille de la mémoire tampon fixe. Étant donné que CFixedStringT
n’utilise pas toujours un tas pour allouer ses données de chaîne, il ne peut pas l’utiliser CAtlStringMgr
comme gestionnaire de chaînes. Il utilise un gestionnaire de chaînes personnalisé (CFixedStringMgr
), implémentant l’interface IAtlStringMgr . Cette interface est décrite dans Implémentation d’un gestionnaire de chaînes personnalisé (méthode avancée) .
Le constructeur prend CFixedStringMgr
trois paramètres :
pData : pointeur vers la structure fixe
CStringData
à utiliser.nChars : nombre maximal de caractères que la
CStringData
structure peut contenir.pMgr : pointeur vers l’interface
IAtlStringMgr
d’un « gestionnaire de chaînes de sauvegarde ».
Le constructeur stocke les valeurs de pData et pMgr dans leurs variables membres respectives (m_pData
et m_pMgr
). Il définit ensuite la longueur de la mémoire tampon sur zéro, la longueur disponible égale à la taille maximale de la mémoire tampon fixe et le nombre de références sur -1. La valeur de nombre de références indique que la mémoire tampon est verrouillée et qu’elle utilise cette instance comme gestionnaire de CFixedStringMgr
chaînes.
Le marquage de la mémoire tampon comme verrouillé empêche les autres CStringT
instances de conserver une référence partagée à la mémoire tampon. Si d’autres CStringT
instances ont été autorisées à partager la mémoire tampon, il serait possible que la mémoire tampon contenue CFixedStringT
soit supprimée alors que d’autres chaînes utilisaient toujours la mémoire tampon.
CFixedStringMgr
est une implémentation complète de l’interface IAtlStringMgr
. L’implémentation de chaque méthode est abordée séparément.
Implémentation de CFixedStringMgr ::Allocate
Implémentation des CFixedStringMgr::Allocate
premières vérifications pour voir si la taille demandée de la chaîne est inférieure ou égale à la taille de la mémoire tampon fixe (stockée dans le m_pData
membre). Si la mémoire tampon fixe est suffisamment grande, CFixedStringMgr
verrouille la mémoire tampon fixe avec une longueur de zéro. Tant que la longueur de la chaîne ne dépasse pas la taille de la mémoire tampon fixe, CStringT
il n’est pas nécessaire de réallouer la mémoire tampon.
Si la taille demandée de la chaîne est supérieure à la mémoire tampon CFixedStringMgr
fixe transfère la requête au gestionnaire de chaînes de sauvegarde. Le gestionnaire de chaînes de sauvegarde est supposé allouer la mémoire tampon à partir du tas. Toutefois, avant de renvoyer cette mémoire tampon CFixedStringMgr
, elle verrouille la mémoire tampon et remplace le pointeur du gestionnaire de chaînes de la mémoire tampon par un pointeur vers l’objet CFixedStringMgr
. Cela garantit que les tentatives de réallouer ou de libérer la mémoire tampon en CStringT
appelleront CFixedStringMgr
.
Implémentation de CFixedStringMgr ::ReAllocate
L’implémentation est CFixedStringMgr::ReAllocate
très similaire à son implémentation de Allocate
.
Si la mémoire tampon réaffectée est la mémoire tampon fixe et que la taille de la mémoire tampon demandée est inférieure à la mémoire tampon fixe, aucune allocation n’est effectuée. Toutefois, si la mémoire tampon réaffectée n’est pas la mémoire tampon fixe, elle doit être une mémoire tampon allouée avec le gestionnaire de sauvegarde. Dans ce cas, le gestionnaire de sauvegarde est utilisé pour réallouer la mémoire tampon.
Si la mémoire tampon réaffectée est la mémoire tampon fixe et que la nouvelle taille de la mémoire tampon est trop grande pour s’adapter à la mémoire tampon fixe, CFixedStringMgr
alloue une nouvelle mémoire tampon à l’aide du gestionnaire de sauvegarde. Le contenu de la mémoire tampon fixe est ensuite copié dans la nouvelle mémoire tampon.
Implémentation de CFixedStringMgr ::Free
L’implémentation de CFixedStringMgr::Free
suit le même modèle que Allocate
et ReAllocate
. Si la mémoire tampon libérée est la mémoire tampon fixe, la méthode la définit sur une mémoire tampon verrouillée de longueur nulle. Si la mémoire tampon libérée a été allouée avec le gestionnaire de sauvegarde, CFixedStringMgr
utilise le gestionnaire de sauvegarde pour la libérer.
Implémentation de CFixedStringMgr ::Clone
L’implémentation de CFixedStringMgr::Clone
toujours retourne un pointeur vers le gestionnaire de sauvegarde plutôt que le CFixedStringMgr
lui-même. Cela se produit parce que chaque instance de CFixedStringMgr
ne peut être associée qu’à une seule instance de CStringT
. Toutes les autres instances de tentative de CStringT
cloner le gestionnaire doivent obtenir le gestionnaire de sauvegarde à la place. Cela est dû au fait que le gestionnaire de sauvegarde prend en charge le partage.
Implémentation de CFixedStringMgr ::GetNilString
Implémentation de CFixedStringMgr::GetNilString
retourne la mémoire tampon fixe. En raison de la correspondance un-on-one de CFixedStringMgr
et CStringT
, une instance donnée de CStringT
ne jamais utiliser plusieurs mémoires tampons à la fois. Par conséquent, une chaîne nil et une mémoire tampon de chaîne réelle ne sont jamais nécessaires en même temps.
Chaque fois que la mémoire tampon fixe n’est pas utilisée, CFixedStringMgr
garantit qu’elle est initialisée avec une longueur nulle. Cela lui permet d’être utilisé comme chaîne nil. En guise de bonus supplémentaire, le nAllocLength
membre de la mémoire tampon fixe est toujours défini sur la taille totale de la mémoire tampon fixe. Cela signifie que CStringT
vous pouvez développer la chaîne sans appeler IAtlStringMgr ::Reallocate, même pour la chaîne nil.
Spécifications
En-tête : cstringt.h