2012-05-17 3 views
7

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

+2

Просто введите код, который вы хотите. –

+3

Сухайл, вы рассмотрели следующие вопросы: http://stackoverflow.com/questions/1116040/memory-efficient-c-strings-interning-ropes-copy-on-write-etc, http://stackoverflow.com/ вопросы/4060411/do-stdstring-use-string-interning? – dbf

+0

@David Schwartz Кэширование как функциональность. Мне нужна строка интернирования –

ответ

15

boost::flyweight<std::string> похоже, именно то, что вы ищете.

+0

Есть ли другой способ. Я не знаю об этой библиотеке –

+0

@SuhailGupta теперь вы: http://www.boost.org –

+0

@ Эрик Робертсон, но есть ли другой способ? –

6

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

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

Если нет, то как проводить интернирование внутри строки в C?

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

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

3

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

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

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

Смежные вопросы