Есть ли что-то вроде intern()
метода в C или C++, как есть в Java? Если нет, как я могу выполнить string interning в C или C++?Как я могу выполнить интернирование строк на C или C++?
ответ
boost::flyweight<std::string>
похоже, именно то, что вы ищете.
Есть ли другой способ. Я не знаю об этой библиотеке –
@SuhailGupta теперь вы: http://www.boost.org –
@ Эрик Робертсон, но есть ли другой способ? –
Есть ли что-то вроде метода intern() в C, как у нас на Java?
Не в стандартной библиотеке C.
Если нет, то как проводить интернирование внутри строки в C?
С большим трудом, боюсь. Первая проблема заключается в том, что «строка» не является четко определенной вещью в C. Вместо этого у вас есть char *
, которая может указывать на строку с нулевым завершением или просто обозначать позицию символа. Тогда у вас есть проблема, что некоторые строки встроены в другие вещи ... или хранятся в стеке. Оба из них делают интернирование невозможным и/или бессмысленным. Тогда есть проблема, что строковые литералы C не гарантируются интернированием ... так, как это гарантирует Java. Наконец, существует проблема, заключающаяся в том, что интернирование - это утечка хранилища, ожидающая, когда это произойдет ... если язык не является сборкой мусора.
Сказав, что способ (осуществить) интернирование в C будет состоять в создании хэш-таблицы для хранения интернированных строк. Вам нужно сделать это предварительным условием, что вы не можете ставить строку, если это не буква или строка, выделенная в своем собственном узле кучи. Чтобы устранить проблему утечки хранилища, вам понадобится подсчет ссылок для каждой строки, чтобы определить, когда интернированная строка может быть отброшена.
Что означало бы интернирование интернирования на языке, который имеет значение семантика? Interning - это механизм принудительного идентификатора объекта для ссылок на строки с идентификатором ценности. Это относится к языкам , которые используют ссылочную семантику и используют идентификатор объекта в качестве функции сравнения по умолчанию . C++ использует семантику значения по умолчанию, а типы , такие как std::string
, не имеют идентификатора, поэтому интернирование не имеет смысла.
Некоторые реализации (например, g ++) могут использовать форму ссылочной семантики для строковых данных за кулисами. Такая реализация может предлагать своего рода интернирование этих данных в качестве расширения. (G ++ нет, насколько я знаю, но делает автоматически «стажер» пустые строки .)
Большинство других реализаций даже не используют эталонные семантику внутренне. Как бы вы выполнили реализацию, используя небольшую оптимизацию строки (например, MS)? Если данные в буквальном смысле находятся в классе , то есть нет динамически выделяемая память.
- 1. Конкатенация строки C# и интернирование строк
- 2. C# Как я могу выполнить метод замены строк в коллекции?
- 3. Как я могу выполнить .bin-файл со сборкой или C?
- 4. Как предотвратить интернирование внутри строки
- 5. Как я могу выполнить индексирование в DataGridView в C# .NET
- 6. Как я могу выполнить простой Applescript из C++-программы?
- 7. Как я могу выполнить скрипт Perl внутри консольного приложения C++?
- 8. Как выполнить синтаксический анализ строк в C++?
- 9. Как я могу выполнить проверку столкновения между двумя точками? (C++)
- 10. как я могу сравнить содержимое массива в C или C++
- 11. Как я могу сделать C++ в C?
- 12. Как я могу выполнить функцию экспоненты в c?
- 13. C - Как я могу выполнить метод каждые X секунд?
- 14. C++ - Как я могу выполнить некоторую операцию над файлом bmp?
- 15. Как я могу выполнить привязку данных в C#?
- 16. C# linq Как я могу выполнить это соединение?
- 17. Как я могу выполнить SQL и Params из C#
- 18. Как я могу выполнить эти операции в C?
- 19. Как я могу выполнить график TensorFlow из protobuf в C++?
- 20. относящиеся к String, интернирование
- 21. Как я могу выполнить композицию Матов с emgu (C#)?
- 22. Как я могу выполнить командную команду в C# напрямую?
- 23. Как я могу выполнить операцию при закрытии приложения консоли C#?
- 24. Как я могу выполнить инструкцию SQLite в C++
- 25. как я могу выполнить программу c под другим
- 26. Как я могу выполнить функцию Oracle в C#
- 27. Могу ли я выполнить один оператор C# в качестве скрипта?
- 28. строка интернирование памяти
- 29. Как я могу инициализировать объект на C++?
- 30. Как я могу инициализировать структуру на C++?
Просто введите код, который вы хотите. –
Сухайл, вы рассмотрели следующие вопросы: 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
@David Schwartz Кэширование как функциональность. Мне нужна строка интернирования –