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

8

Есть ли что-то вродеintern() метод в C или C ++, как есть в Java? Если нет, как я могу выполнитьинтернирование строк в C или C ++?

Suhail, вы смотрели на эти вопросы:stackoverflow.com/questions/1116040/… , stackoverflow.com/questions/4060411/… ? dbf
Просто код, что вы хотите. David Schwartz
Похоже, вы ищете boost :: flyweight & lt; std :: string & gt ;, все идентичные строки будут использовать одну и ту же память. Ylisar
@ Дэвид Шварц Функциональность кэширования. Я хочу интернирование строк Suhail Gupta
@Р. Мартиньо Фернандес, я спросил в CAND C ++ Suhail Gupta

Ваш Ответ

3   ответа
3

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

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

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

6

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 будет состоять в создании хеш-таблицы для хранения интернированных строк. Вы должны сделать предварительным условием, что вы не можете интернировать строку, если она не является литералом или строкой, размещенной в ее собственном узле кучи. Чтобы решить проблему утечки памяти, вам необходимо подсчитать число ссылок на строку, чтобы определить, когда интернированная строка может быть отброшена.

15

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

Точнееboost::flyweight делает объект неизменным,[] не вызовет проблем, потому чтоboost::flyweight< T > только когда-либо выставляетconst T&.
Есть ли другой путь. Я не в курсе этой библиотеки Suhail Gupta
@SuhailGupta теперь вы:boost.org
@SuhailGupta Если бы я знал другой путь, я бы добавил еще один ответ.
@ Эрик Робертсон, ха-ха! Suhail Gupta

Похожие вопросы