Je veux un conteneur de pointeur C++ sécurisé similaire à scoped_ptr
de boost, mais avec une sémantique de copie de type valeur. J'ai l'intention de l'utiliser pour un élément très rarement utilisé de classe très fortement utilisée dans la boucle la plus interne d'une application pour obtenir une meilleure localisation mémoire. En d'autres termes, je ne me soucie pas de la performance de cette classe tant que sa charge de mémoire "en ligne" est faible.Ce conteneur de pointeur C++ est-il sécurisé?
J'ai commencé avec ce qui suit, mais je ne suis pas très doué pour ça; est le coffre-fort suivant? Est-ce que je réinvente la roue et si oui, où devrais-je regarder?
template <typename T>
class copy_ptr {
T* item;
public:
explicit copy_ptr() : item(0) {}
explicit copy_ptr(T const& existingItem) : item(new T(existingItem)) {}
copy_ptr(copy_ptr<T> const & other) : item(new T(*other.item)) {}
~copy_ptr() { delete item;item=0;}
T * get() const {return item;}
T & operator*() const {return *item;}
T * operator->() const {return item;}
};
Edit: oui, il est intentionnel que ce comportement à peu près exactement comme une valeur normale. Le profilage montre que l'algorithme est par ailleurs assez efficace mais est parfois gêné par des échecs de cache. En tant que tel, j'essaie de réduire la taille de l'objet en extrayant de gros blobs qui sont actuellement inclus par valeur mais ne sont pas réellement utilisés dans les boucles les plus internes. Je préférerais faire cela sans changements sémantiques - un simple wrapper de template serait idéal.
Hmm ... Je ne suis pas sûr de savoir à quoi cela servirait. L'objet réel lui-même présente déjà une sémantique de copie, alors pourquoi utiliser un pointeur? C'est comme si vous réimplémentiez la sémantique d'une variable de pile automatique ici. –
* C'est ce que je veux! * Comme mentionné dans la question, cela améliore la localisation de la mémoire. Il est utilisé dans une simulation avec des paramètres assez lourds, écrits pour la clarté, mais où les paramètres ne sont pas réellement pertinents lors de l'exécution du calcul. Je ne peux pas mettre les paramètres à la fin de l'objet car l'héritage est en cours et les paramètres sont déclarés dans une classe ancêtre. –
Vous n'utilisez pas un emplacement nouveau ou quoi que ce soit pour contrôler où la copie est créée, alors pourquoi avoir une copie de l'objet dans un emplacement aléatoire dans le tas améliore la localité plutôt que d'avoir une copie de l'objet sur les autres variables locales la pile? Quelle architecture est-ce? –