Каково различие между строковой константой и строковым литералом?

def reverse_lines(filename):
    y=open(filename).readlines()
    return y[::-1]
59
задан R.. 28 August 2010 в 22:11
поделиться

2 ответа

В Objective C синтаксис @"foo" неизменен , литерал экземпляр NSString. Это не делает постоянную строку из строкового литерала, как Mike предполагает.

компиляторы Objective C обычно делают литеральные строки интерна в единицах компиляции — то есть, они объединяют совместные использования той же литеральной строки —, и для компоновщика возможно сделать дополнительное интернирование через единицы компиляции, которые непосредственно связаны в единственный двоичный файл. (Так как Какао различает изменяемые и неизменные строки, и литеральные строки всегда также неизменны, это может быть просто и безопасно.)

строки Constant, с другой стороны, обычно объявляются и определили синтаксис использования как это:

// MyExample.h - declaration, other code references this
extern NSString * const MyExampleNotification;

// MyExample.m - definition, compiled for other code to reference
NSString * const MyExampleNotification = @"MyExampleNotification";

точка синтаксического осуществления здесь - то, что можно сделать использование строка эффективный путем обеспечения, что существует только один экземпляр той строки, используемой даже через несколько платформ (совместно использованные библиотеки) в том же адресном пространстве. (Размещение const вопросы ключевого слова; это гарантирует, что сам указатель, как гарантируют, будет постоянным.)

, В то время как горящая память не является столь большим соглашением, как это, возможно, было в эпоху 25 МГц, 68 030 рабочих станций с 8 МБ RAM, сравнивая строки для равенства могут занять время. Обеспечение, что большинство строк времени, которые равны, также будет равно указателю, помогает.

Говорят, например, Вы хотите подписаться на уведомления от объекта по имени. При использовании непостоянных строк для имен NSNotificationCenter, регистрация уведомления могла бы завершить выполнение большого количества сравнений байта строкой байтов при определении, кто интересуется им. Если большинство этих сравнений закорачивается, потому что сравниваемые строки имеют тот же указатель, который может быть большой победой.

83
ответ дан Community 24 November 2019 в 18:25
поделиться

Давайте использовать C++, так как мой Objective C полностью не существует.

, Если Вы прячете строку в постоянную переменную:

const std::string mystring = "my string";

Теперь при вызове методов Вы используете my_string, Вы используете строковую константу:

someMethod(mystring);

Или, можно назвать те методы со строковым литералом непосредственно:

someMethod("my string");

причина, по-видимому, что они поощряют Вас использовать строковые константы, состоит в том, потому что Objective C не делает "интернирования"; то есть, при использовании того же строкового литерала в нескольких местах это - на самом деле различный указатель, указывающий на отдельную копию строки.

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

Редактирование: Mike, в строках C# неизменные, и литеральные строки с идентичными значениями весь конец, указывающий на то же строковое значение. Я воображаю это правда для других языков также, которые имеют неизменные строки. В Ruby, который имеет изменяемые строки, они предлагают новый тип данных: символы ("нечто" по сравнению с: нечто, где первый - изменяемая строка и последний, является неизменным идентификатором, часто используемым для ключей Хеша).

3
ответ дан Brad Wilson 24 November 2019 в 18:25
поделиться
Другие вопросы по тегам:

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