2012-05-17 10 views
7

Esiste qualcosa come il metodo intern() in C o C++ come in Java? Se non c'è, come posso eseguire string interning in C o C++?Come posso eseguire interning stringa in C o C++?

+2

Basta codificare esattamente ciò che si desidera. –

+3

Suhail, hai dato un'occhiata a queste domande: http://stackoverflow.com/questions/1116040/memory-efficient-c-strings-interning-ropes-copy-on-write-etc, http://stackoverflow.com/ domande/4060411/does-stdstring-use-string-interning? – dbf

+0

@David Schwartz Una funzionalità simile alla cache. Voglio internare le stringhe –

risposta

15

boost::flyweight<std::string> sembra essere esattamente quello che stai cercando.

+0

C'è qualche altro modo. Non sono a conoscenza di questa libreria –

+0

@SuhailGupta ora sei: http://www.boost.org –

+0

@Erick Robertson ma esiste un altro modo? –

6

C'è qualcosa come il metodo intern() in C come abbiamo in Java?

Non nella libreria C standard.

Se non c'è, come eseguire internamento stringa in C?

Con molta difficoltà, temo. Il primo problema è che "stringa" non è una cosa ben definita in C. Invece si ha char *, che potrebbe puntare a una stringa terminata da zero, o potrebbe semplicemente denotare una posizione di carattere. Quindi hai il problema che alcune stringhe sono incorporate in altre cose ... o sono memorizzate nello stack. Entrambe le cose rendono l'internamento impossibile e/o privo di significato. Quindi, c'è il problema che i letterali di stringa C non sono garantiti per essere internati ... nel modo in cui Java lo garantisce. Infine, c'è il problema che l'interning è una perdita di memoria in attesa di accadere ... se la lingua non è raccolta di dati inutili.

Detto questo, il modo per (tentare di) implementare interning in C è creare una tabella hash per contenere le stringhe internate. Dovresti renderlo una precondizione che non puoi internare una stringa a meno che non sia una stringa letterale o una stringa allocata nel proprio nodo heap. Per risolvere il problema di perdita di memoria, è necessario un conteggio di riferimento per stringa per rilevare quando è possibile scartare una stringa internata.

3

Cosa significa stringa di interning in una lingua con valore di semantica ? Interning è un meccanismo per forzare l'identità dell'oggetto per i riferimenti alle stringhe con identità di valore. È rilevante nelle lingue che utilizzano la semantica di riferimento e utilizzano l'identità dell'oggetto come funzione di confronto predefinita . Il C++ utilizza la semantica del valore per impostazione predefinita e i tipi come std::string non hanno identità, quindi l'interning non ha senso.

Alcune implementazioni (ad es. G ++) possono utilizzare una forma di semantica di riferimento per i dati di stringa, dietro le quinte. Tale implementazione potrebbe offrire una sorta di internamento di tali dati, come un'estensione. (G ++ non lo fa, per quanto ne so, ma lo fa automaticamente "Interno" vuoti stringhe.)

La maggior parte delle altre implementazioni non hanno nemmeno usare la semantica di riferimento internamente. Come implementare un'implementazione utilizzando l'ottimizzazione delle stringhe piccola (come MS)? Dove i dati sono letteralmente nella classe in alcuni casi, e c'è no memoria allocata dinamicamente.

Problemi correlati