Вопрос по c, c++ – Как я могу сделать интернирование строк в C или C ++?
========================================================================

Есть ли что-то вроде[`intern()`](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#intern%28%29) метод в C или C ++, как есть в Java? Если нет, как я могу выполнить[интернирование строк](https://en.wikipedia.org/wiki/String_interning) в C или C ++?

Что будет означать интернирование строк в языке, который имеет значение
семантика? Стажировка - это механизм, чтобы заставить объект
ссылки на строки со значением идентичности. Это актуально для языков
которые используют ссылочную семантику и используют идентификатор объекта по умолчанию
функция сравнения. C ++ по умолчанию использует семантику значений и типы
лайк`std::string` не имеют идентичности, поэтому интернирование не имеет смысла.

Некоторые реализации (например, g ++) могут использовать форму ссылочной семантики
для строковых данных, за кулисами. Такая реализация*could*
предложить какой-то интернирование этих данных, как расширение. (G ++
насколько я знаю, не "но" автоматически "интернирует" пустой
строки.)

Большинство других реализаций даже не используют ссылочную семантику
внутренне. Как бы вы интернировали реализацию, используя маленький
оптимизация строк (например, MS)? Где данные буквально в классе
в некоторых случаях и есть*no* динамически распределяемая память.



> 
> Is there something like intern() method in C like we have in Java ? 
> 
> 
> 

Не в стандартной библиотеке C.

> 
> If there isn't, how to carry out string interning in C?
> 
> 
> 

Боюсь с большим трудом. Первая проблема заключается в том, что «строка» не является четко определенной вещью в C. Вместо этого у вас есть`char *`, который может указывать на строку с нулевым символом в конце или просто обозначать позицию символа. Тогда у вас проблема в том, что некоторые строки встроены в другие объекты ... или хранятся в стеке. Оба из которых делают интернирование невозможным и / или бессмысленным. Кроме того, существует проблема, заключающаяся в том, что строковые литералы Си не гарантированы для интернирования ... так, как это гарантирует Java. Наконец, существует проблема, заключающаяся в том, что интернирование - это утечка памяти, ожидающая своего возникновения ... если язык не является сборщиком мусора.

Сказав это, способ (попытка) реализовать интернирование в C будет состоять в создании хеш-таблицы для хранения интернированных строк. Вы должны сделать предварительным условием, что вы не можете интернировать строку, если она не является литералом или строкой, размещенной в ее собственном узле кучи. Чтобы решить проблему утечки памяти, вам необходимо подсчитать число ссылок на строку, чтобы определить, когда интернированная строка может быть отброшена.



`boost::flyweight< std::string >` кажется, именно то, что вы ищете.