9
votes

Comment puis-je faire des strings interne en C ou C ++?

Y a-t-il quelque chose comme stagiaire () méthode en C ou C ++ comme il y a à Java? S'il n'y a pas, comment puis-je effectuer String Interning en C ou C ++?


11 commentaires

Juste code exactement ce que vous voulez.


Suhail, avez-vous regardé ces questions: Stackoverflow.com/questions/1116040/... , Stackoverflow.com/Questtions/4060411/... ?


@David Schwartz une mise en cache comme fonctionnalité. Je veux une chaîne interne


On dirait que vous recherchez Boost :: Flyweight , toutes les chaînes identiques utiliseront la même mémoire.


Y a-t-il quelque chose comme une méthode interne () dans "C / C ++"? Non, il n'y a pas de C / C ++. QED.


@Ylisar Je pense que c'est ce que l'on appelle String String Interning ! Je ne connais aucune bibliothèque


@R. Martinho Fernandes J'ai demandé à C et C ++


@Suhailgupta Eh bien, ce sont deux questions différentes. Si vous vous souciez vraiment de la réponse à , vous devriez faire deux postes.


Jetez un coup d'œil à Flyweight: Boost.org/doc/ LIBS / 1_49_0 / LIBS / Flyweight / Doc / Index.HTML


@ Shog9 a fait de «vous» fusionner les questions? Si oui, alors quelle réponse dois-je accepter. Celui qui répond à la requête C ou C ++? Et vous avez changé le sens de ma question. J'avais et au lieu de ou


@Subhail: Vous allez soit implémenter cela en C ou C ++. Alors décidez lequel, puis acceptez la réponse correspondante. Et non, je n'ai pas fermé ou fusionner cela, juste édité après le fait de permettre des réponses sur l'une ou l'autre langue à suffire.


3 Réponses :


18
votes

boost :: flyweight semble être exactement ce que vous recherchez.


6 commentaires

Est-ce qu'il y a un autre moyen. Je ne suis pas au courant de cette bibliothèque


@Erick Robertson mais y a-t-il une autre façon?


@Suhailgupta Si je savais d'une autre façon, j'ajouterais une autre réponse.


Si vous pouvez mettre à nu l'interface typedef std :: hash_set stringcache; vous net vous net pas une version moins fantaisie de ce que vous recherchez. La bibliothèque standard C ++ est des os très nus comparés à la plupart des autres langues.


Notez que boost :: flyweight nécessite que les objets soient immuables; Ce n'est pas le cas de std :: chaîne . Des choses comme [] sont susceptibles de causer des problèmes (ou non, en fonction de la manière dont les objets sont utilisés ultérieurement).


Plus précisément boost :: flyweight rend l'objet immuable, [] ne causera pas de problèmes car boost :: flyweight ne présente que jamais const t & .



6
votes

Y a-t-il quelque chose comme stagiaire () méthode en C comme nous avons à Java?

pas dans la bibliothèque C. / P>

S'il n'y a pas, comment effectuer une chaîne interne en c?

Avec une grande difficulté, je crains. Le premier problème est que la "chaîne" n'est pas une chose bien définie dans C. Au lieu de cela, vous avez Char * , qui pourrait pointer sur une chaîne terminée zéro ou peut-être simplement désigner une position de caractère. Ensuite, vous avez le problème que certaines chaînes sont intégrées dans d'autres choses ... ou sont stockées sur la pile. Les deux qui rendent interne impossible et / ou sans signification. Ensuite, il y a le problème que C littéraux de chaîne ne sont pas garantis à être internés ... dans la manière dont Java vous garantit. Enfin, il y a le problème que l'interne est une fuite de stockage en attente de se produire ... si la langue n'est pas une poubelle collectée.

Ayant dit que, la voie à (tenter de) mettre en œuvre le projection dans C serait de créer une table de hachage pour contenir les chaînes internes. Vous auriez besoin de faire une condition préalable que vous ne puissiez pas interner une chaîne à moins que ce soit un littéral ou une chaîne allouée dans son propre noeud de tas. Pour résoudre le problème de la fuite de stockage, vous auriez besoin d'un nombre de référence par chaîne pour détecter lorsqu'une chaîne interne peut être supprimée.


0 commentaires

2
votes

qu'est-ce que la chaîne interne signifie dans une langue qui a une valeur sémantique? Interne est un mécanisme pour forcer l'identité d'objet pour Références aux chaînes avec identité de la valeur. Il est pertinent dans les langues qui utilise la sémantique de référence et utilisez l'identité d'objet comme défaut Fonction de comparaison. C ++ utilise la sémantique de la valeur par défaut et types Comme std :: string n'a pas d'identité, donc interne n'a aucun sens.

Certaines implémentations (par exemple G ++) peuvent utiliser une forme de sémantique de référence pour les données de chaîne, dans les coulisses. Une telle mise en œuvre pourrait Offrez une sorte de reliant de ces données, comme une extension. (G ++ pas, autant que je sache, mais fait automatiquement "stagiaire" vide cordes.)

La plupart des autres implémentations n'utilisent même pas la sémantique de référence intérieurement. Comment feriez-vous une mise en œuvre à l'aide du petit Optimisation des chaînes (comme MS)? Où les données sont littéralement dans la classe Dans certains cas, et il y a no la mémoire allouée de manière dynamique.


0 commentaires