2015-09-23 4 views
1

Actuellement, j'ai cela se passe:Créer une std :: string avec un emplacement de données fixe

struct HashItem { 
    uint32_t Value; 
    char Key; 

    uint32_t GetSize() { 
     return 4 + GetKey().size(); 
    } 

    void SetKey(std::string &Key) { 
     memcpy(&(this->Key), Key.c_str(), Key.size()); 
    } 
    std::string GetKey() { 
     return std::string(&Key); 
    } 

    static HashItem* Cast(void* p) { 
     return reinterpret_cast<HashItem*>(p); 
    } 
}; 

Ce struct est censé être une interprétation d'un emplacement du pointeur dans un MMF. Au début, j'ai une table de hachage et juste après, ce sont ces HashItems en série. Je me demandais cependant s'il était possible de créer une chaîne std :: avec un caractère fixe * (pointant vers où se trouve actuellement la clé char) pour savoir où conserver les données réelles?

Cette mémoire est gérée manuellement de toute façon et avoir un champ de chaîne au lieu d'un champ char serait plus pratique.

+0

'std :: string' peut être tellement plus qu'un littéral de chaîne constant - donc généralement la réponse est non. Pourquoi ne pas utiliser un pointeur où un pointeur est dû? Si vous devez réellement faire des chaînes sur votre clé (comme la comparaison), vous devrez les implémenter vous-même (c'est-à-dire utiliser la bibliothèque standard pour les chaînes C), mais vous éviterez également les frais d'allocation. – BeyelerStudios

+0

Is est une faute de frappe, ou 'Key' est juste un seul char? –

+0

@SergeBallesta Son un espace réservé pour récupérer le pointeur seulement – user81993

Répondre

1

... s'il était possible de créer une chaîne std :: avec un caractère fixe * (pointant vers où se trouve actuellement la clé char), où conserver les données réelles?

Pas vraiment - std :: string gère explicitement et très clairement sa propre mémoire. Vous pourriez peut-être le pirater avec un allocateur personnalisé, mais je suis enclin à penser que ce serait horrible.

Si vous voulez juste quelque chose comme unstd::string (ie, ayant les mêmes opérateurs et interface publique) mais ne possédant pas sa propre mémoire, il suffit d'utiliser un Boost.String_Ref, qui fait ce que vous (semblez) sans vouloir hacks.

1

Non, ce n'est pas possible.
En outre, lorsque vous renvoyez un std::string dans GetKey() vous copiez en fait la chaîne. std::string toujours les gestionnaires de sa propre mémoire. Une bonne raison à cela est que le pointeur peut changer sans avertissement et vous ne pouvez jamais compter sur où il se trouve.
La plupart des implémentations de std::string ont une "optimisation de chaîne courte" où, pour les chaînes de longueur inférieure à 16 caractères, la mémoire est réellement présente dans l'objet chaîne en tant que tableau. pour quelque chose de plus, la mémoire est allouée. Ce type d'invariant (si len < 16 pointeur est un autre pointeur est B) ne peut pas être maintenu si le pointeur peut provenir de l'extérieur.