IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

Memory pool, std::string et copies


Sujet :

SL & STL C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 28
    Points
    28
    Par défaut Memory pool, std::string et copies
    Bonjour,

    Je voudrai avoir dans le principe un buffer de char contigue assez grand, et plein de std::string qui pointe dessus sans copier les char.

    Je me suis dit qu'avec quelquechose comme cela ca irait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    std::string strBuffer
     
    strBuffer.reserve(4096);
    // remplissage de strBuffer;
     
    std::string strOne(strBuffer, 10, 15);
    std::string strTwo(strBuffer, 2050, 2090);
    // etc
    le probleme, c'est que les infos sur la stl que j'ai trouvé jusque la ne sont pas tres clair.
    En gros la doc dit que le constructeur utilisé copie quoi qu'il se passe, mais beaucoup disent que selon l'implémentation la copie n'est pas faite tant que l'on n'essaye pas de modifier la sous-string etc.

    ma question est donc, y a t il un moyen avec les std::string de faire ce genre de chose, et explicitement ne pas faire de copie, mais avoir des 'petites' string pointant toutes sur un buffer commun.

  2. #2
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Faut passer par des ranges mais rien en STL, goto boost.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    C'est bien ce que je craignais. le problème c'est qu'avec les boost::range et d’après les exemple que j'ai vu ils ne touchent pas du tout aux std::string, tout surcouche directement du char, et ça m’embête un peu de devoir tout re-gérer.

    C'est quand même étrange que la stl n'ai pas prévu ce genre de mécanisme, c'est un besoin assez courant non ?

  4. #4
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par typedef Voir le message
    En gros la doc dit que le constructeur utilisé copie quoi qu'il se passe, mais beaucoup disent que selon l'implémentation la copie n'est pas faite tant que l'on n'essaye pas de modifier la sous-string etc.
    Ce que tu décris là se nomme copy-on-write (COW). Il est fortement déconseillé de supposer que sa biblio standard se base dessus, car le COW est voué à disparaitre des implémentations de std::string (il est interdit en C++0x). D'ailleurs il me semble que seule la bibliothèque standard C++ libstdc++ (celle qui vient avec gcc) l'utilise encore.

    Pour ce qui est des ranges sur une string, je préfère nettement utiliser quelque chose comme le StrinRef du projet LLVM ou encore le StringPiece du projet Chromium. Ce sont toutes les deux des classes immutables extrêmement légères, car implémentées en interne comme un range (un pointeur de début, une taille), mais qui ont l'avantage, contrairement aux ranges de boost, de proposer l'interface familière de std::string.


    Un exemple avec StringPiece :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    std::string strBuffer = "mot1 mot2";
     
    StringPiece strOne(strBuffer.data(), 4);
    StringPiece strTwo(strBuffer.data() + 5, 4);
     
    // naturellement, pas de méthodes push_back, assign, append etc. 
    // StringPiece est immutable. 
    // En revanche, on peut faire ce genre d'opérations :
     
    std::cout << strOne.size() << std::endl;
    std::cout << strOne << std::endl;
    std::cout << strTwo.size() << std::endl;
    std::cout << strTwo << std::endl;
     
    std::cout << strOne[3] << " " << strTwo[3] << std::endl;
    std::cout << strOne.compare(strTwo) << std::endl;
    std::cout << strOne.starts_with("mot") << std::endl;
    strOne.remove_prefix(3);
    strTwo.remove_suffix(1);
    std::cout << strOne << std::endl;
    std::cout << strTwo << std::endl;

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    J'ai un peu regardé StringPiece, ça a l'air sympa, mais peut on les extraire sans tirer trop de chose ?

    en fait comme je suis déjà dépendant de boost, j'aimerai ne pas tirer trop de grosse lib / framework surtout quand leur objets sont exposé dans mes api, pour un soucis de cohérence des interfaces/namespace, et aussi du a des contraintes de portabilité (windows, macos, ios, linux).

    j'ai déjà trop de dépendance a boost, pour passer a complètement autre chose

  6. #6
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Surtout que mixer LLVM/clang et boost, c'est une véritable misére...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  7. #7
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par typedef Voir le message
    J'ai un peu regardé StringPiece, ça a l'air sympa, mais peut on les extraire sans tirer trop de chose ?
    Ben oui, c'est tout l'intérêt de la manip
    StringPiece, c'est string_piece.h + string_piece.cc et voilà. (il faut juste virer l'include "base/basictypes.h" dans string_piece.h qui de toute façon ne semble pas utilisé)

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    Effectivement, je pense que ça va m’être utile.

    merci pour vos réponses,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. std::string to_string
    Par shirya dans le forum SL & STL
    Réponses: 5
    Dernier message: 20/12/2005, 15h28
  2. Réponses: 7
    Dernier message: 25/11/2005, 17h11
  3. [débutant] equivalent à sprintf pour les std::string
    Par Biosox dans le forum SL & STL
    Réponses: 22
    Dernier message: 26/08/2005, 12h46
  4. cannot convert 'std::string' to 'System::String ^'
    Par broadhead dans le forum MFC
    Réponses: 1
    Dernier message: 14/06/2005, 11h37
  5. std::string, operator =
    Par tut dans le forum SL & STL
    Réponses: 10
    Dernier message: 05/11/2004, 12h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo