Как Вы реализовали бы свой строковый тип?

Я в той же ситуации. Прошло несколько дней, и я не могу исправить эту ошибку. Это мой вопрос о Stackoverflow: Как исправить ошибку «Ошибка входа в социальную сеть» для django-allauth, развернутого на Elastic Beanstalk

Редактировать: я видел ваш ответ, но он не работал для меня , вы уверены, что это было единственное, что вы изменили, чтобы заставить его работать?

В любом случае значение «https» должно быть в кавычках:

ACCOUNT_DEFAULT_HTTP_PROTOCOL = 'https'

Можете ли вы дать больше информации о изменения, которые вы сделали в своем коде и конфигурации?

5
задан Hank Gay 19 February 2009 в 18:11
поделиться

6 ответов

Если бы я писал язык с нуля, то я хотел бы и изменяемые и неизменные определенные строковые типы. Неизменность делает строковые погрузочно-разгрузочные работы намного быстрее, но создает серьезные ограничения, особенно когда дело доходит до конкатенации и т.п..

Неизменная строка, я сохранил бы как завершенный пустым указателем массив значений unicode. Изменяемая строка, я сохранил бы как связанный список unicode символов для более легкой перестановки, разрезания, и т.д.

5
ответ дан 18 December 2019 в 14:52
поделиться

Я избежал бы струн до. Вычисления длины являются O (n). Совместное использование подстрок почти невозможно. Непрерывное требование к памяти приводит к фрагментации. Любая проблема с разделителем приводит к ошибкам и дырам в системе безопасности. При хранении его как UCS-4 Вы тратите впустую много пространства для строк ASCII (и теряете совместимость C, одно преимущество струн до); при хранении его как UTF-8 индексация является O (n). Тип PDP-11 ASCIZ только действительно имел большой смысл, когда Вы пишете библиотеку для ASCII на пустом PDP-11.

Языки, моложе, чем PDP-11 часто, используют другую структуру:

  • Паскаль использует поле длины вместо разделителя - их strlen () является O (1).
  • Использование Forth (адрес, длина) удваивается - их strlen () является O (1), плюс они могут легко совместно использовать подстроки.
  • Много современных "управляемых" языков как Java хранят длину отдельно, также.
  • На других языках (как язык Common LISP), строки являются просто подтипом вектора (чьи элементы являются символами).
  • Команда Excel использовала C, но реализовала их собственные строки Паскаля для производительности.

Я использовал бы что-то как веревки. Конкатенация является постоянно-разовой. Они не требуют непрерывной памяти. Подстрока, совместно использующая, легка. Все операции могут быть выполнены, не привязывая многопоточную среду. Возможно, позвольте и UCS-4 и узлам ASCII делать устройство хранения данных более компактным в общем падеже, и/или иметь его автоматически используют более простую структуру внутренне для действительно коротких строк.

ASCIZ является большим, если у Вас есть мало памяти, короткие строки, 7-разрядные символы, доверяли входу, и Ваш ЦП является столь медленным, что это стоящее Вашего разового программистом, чтобы быть действительно осторожным. В современном мире Unicode, многопоточности, эффективного GC, быстрых центральных процессоров, и большой (возможно недоверяемый) исходные данные, это больше не большой выбор.

3
ответ дан 18 December 2019 в 14:52
поделиться

Я предполагаю, что Вы имеете в виду, как будто Вы разрабатывали язык? Затем я предполагаю, что пошел бы с моделью C и сохранил бы ее как непрерывную часть памяти, завершенный пустой указатель. Это кажется самым логическим путем ко мне.

Профессионалы: Никакая память не пропала впустую при дисконтировании пустого указателя.

Недостатки: должны вычислить длину строки с помощью метода, и т.д.

2
ответ дан 18 December 2019 в 14:52
поделиться

Я полагаю, что Вы спрашиваете того, как Вы реализовали бы строковый объект.

По причинам производительности Вы хотели бы сохранить память выделенной для символов в строке как единственный блок. Это ускорило бы операции, выполненные на всех элементах - изменение случая, копия, расчет длины, indexof и так далее. Это также поможет реализовать операции, которые работают над запуском или концом строки - обрезка, подстрока и так далее.

Существуют определенные операции, где структура данных как связанный список помогла бы реализовать, как вставка или удалить символа/подстроки. Однако, учитывая отношение памяти наверху для поддержания такой структуры данных к средней длине строки стоимость перевешивает любые потенциальные усиления.

Должна ли строка быть неизменной или не продиктована двумя соображениями:

  • Вы предоставляете прямой доступ к устройству хранения данных памяти или если все операции инкапсулируются в классе?
  • Ваше выделение памяти организовано временем выполнения, или необходимо ли управлять им сами?

Традиционный подход C++ должен предоставить прямой доступ к базовой памяти к коду, который использует строковый объект. Это имеет большой смысл, так как память выделяется и управляется клиентским кодом так или иначе, таким образом предоставление прямого доступа к нему предлагает лучшую производительность. Недостаток состоит в том, что любая операция, которая изменяет длину строки обычно, приводит к перераспределению памяти. Существуют умные строковые классы, что impelemnt их собственный диспетчер памяти для контакта с этой проблемой, как CString ATL.

Подход C# должен инкапсулировать базовую память в объекте и сделать строку неизменной. Это позволяет, чтобы памятью управлял CLR, и объекты собраны "мусор" теми же правилами, которые относятся к любому другому объекту. Из-за этого существует маленький штраф перфекта, но преимущества упрощенного использования и способности предложить стабильную реализацию довольно сложных операций перевешивают стоимость для перфекта. Плюс, существует сопроводительный класс StringBuilder, который предлагает некоторые преимущества прямого доступа к памяти prealocating более крупным буфером и видоизменением экземпляра в нем, пока это не завершено к Строковому экземпляру.

1
ответ дан 18 December 2019 в 14:52
поделиться

Я запустил бы путем требования кодирования, присоединенного к строке. Если бы не указанный в источнике, строковые литералы имели бы то же кодирование самим исходным файлом.

Конечно, я склоняюсь к UTF-8 и вероятно принял бы меры, чтобы стандартная библиотека работала в том механизме

Кроме того, я рассмотрел бы использование структурного представления, которое немного более умно, чем массив байтов, потому что, кто хочет извести с буферами!

Библиотека шаблонов SGI идет с абстрактным типом 'веревки', который делает это вполне прилично. Итераторы (но не повторение) являются дорогими, но в обмен, вставляет, удаляет, добавляет, поддиапазоны и сравнения являются все довольно дешевыми.

В Руководстве по программированию Lua существует другая хорошая реализация, которое реализует оптимизацию 'Ханойской башни', которая идеально подходит для создания строк от передней стороны до спины многократно, как часто делается при чтении большого файла.

TCL имеет косвенный способ сделать это посредством его виджета текстового поля. Это даже делает аннотирование текста обычно полезным. Единственный недостаток - это дизайнерские работы плохо для последовательностей, которые не имеют ориентированного на строку распределения.

Основная причина, процитированная за использование неизменных строк, состоит в том, потому что динамический или интерпретируемый язык использует строки для себя. Действительно это использует атомы, которые произвольны, но должны быть конвертируемыми к и от строк. Lisp делает это явно с константами символа отделяется от строк. Мне нравится это, даже при том, что я не в других отношениях очарован из шепелявости.

2
ответ дан 18 December 2019 в 14:52
поделиться

Я скрыл бы Строковый класс.NET и создал бы из этого.

0
ответ дан 18 December 2019 в 14:52
поделиться
Другие вопросы по тегам:

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