Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
В чем разница между Строковой константой и строковым литералом?
Я изучаю objective-C и Cocoa и наткнулся на это утверждение:
Фреймворки Cocoa предполагают, что глобальные строковые константы, а не строковые литералы используются для ключей справочника, имен уведомлений и исключений, а также некоторых параметров метода, которые принимают строки.
Я работал только на языках более высокого уровня, поэтому мне никогда не приходилось так много рассматривать детали строк. В чем разница между Строковой константой и строковым литералом?
В Objective-C синтаксис @"foo" является неизменяемым, буквальным экземпляром NSString . Это не делает постоянную строку из строкового литерала, как предполагают Майки.
Цель-компиляторы C обычно интернируют литеральные строки в единицах компиляции — то есть они объединяют многократное использование одной и той же литеральной строки — и компоновщик может выполнить дополнительное интернирование между единицами компиляции, которые непосредственно связаны в один двоичный файл. (Поскольку Cocoa различает изменяемые и неизменяемые строки, а литеральные строки всегда также неизменяемы, это может быть простым и безопасным.)
Константные строки с другой стороны обычно объявляются и определяются с помощью такого синтаксиса:
// 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 имеет значение; это гарантирует, что сам указатель гарантированно будет постоянным.)
Хотя сжигание памяти не так важно, как это могло бы быть в дни рабочих станций 25MHz 68030 с 8MB RAM, сравнение строк для равенства может занять некоторое время. Обеспечение того, что большинство строк времени, которые равны, также будут равны указателю, помогает.
Скажем, например, вы хотите подписаться на уведомления от объекта по имени. Если вы используете непостоянные строки для имен, то NSNotificationCenter , отправляющий уведомление, может в конечном итоге сделать много сравнений строк byte-by-byte при определении того, кто в нем заинтересован. Если большинство этих сравнений будут короткими, потому что сравниваемые строки имеют один и тот же указатель, это может быть большой выигрыш.
Некоторые определения
Литерал - это значение, которое является неизменяемым по определению. например: 10
Константа - это переменная или указатель только для чтения. например: const int age = 10;
Строковый литерал - это выражение типа @"" . Компилятор заменит его экземпляром NSString .
Строковая константа - это указатель только для чтения на NSString . например: NSString *const name = @"John";
Некоторые комментарии к последней строке:
- Это постоянный указатель, а не постоянный объект 1 .
objc_sendMsg2 не имеет значения, если вы квалифицируете объект с помощьюconst. Если вам нужен неизменяемый объект, вы должны закодировать эту неизменяемость внутри объекта 3 . - Все выражения
@""действительно неизменны. Они заменяются 4 во время компиляции экземплярамиNSConstantString, который является специализированным подклассомNSStringс фиксированным расположением памяти 5 . Это также объясняет, почемуNSStringявляется единственным объектом, который может быть инициализирован во время компиляции 6 .
Постоянная строка будет иметь значение const NSString* name = @"John"; , что эквивалентно NSString const* name= @"John"; . Здесь и синтаксис, и намерение программиста ошибочны: const <object> игнорируется, а экземпляр NSString ( NSConstantString ) уже был неизменяемым.
1 ключевое слово const applies относится к тому, что находится непосредственно слева от него. Если слева от него ничего нет, он обращается ко всему, что находится непосредственно справа.
Давайте использовать C++, так как моя цель C совершенно не существует.
Если вы прячете строку в постоянную переменную:
const std::string mystring = "my string";
Теперь, когда вы вызываете методы, вы используете my_string, вы используете строковую константу:
someMethod(mystring);
Или же вы можете вызвать эти методы с помощью строкового литерала напрямую:
someMethod("my string");
Причина, по-видимому, в том, что они поощряют вас использовать строковые константы, заключается в том, что Objective C не делает "interning"; то есть, когда вы используете один и тот же строковый литерал в нескольких местах, это фактически другой указатель, указывающий на отдельную копию строки.
Для ключей словаря это имеет огромное значение, потому что если я вижу, что два указателя указывают на одно и то же, это намного дешевле, чем делать сравнение всей строки, чтобы убедиться, что строки имеют одинаковое значение.
Edit: Mike, в C# строки являются неизменяемыми, а литеральные строки с одинаковыми значениями все заканчиваются указывая на одно и то же строковое значение. Я полагаю, что это верно и для других языков, которые имеют неизменяемые строки. В Ruby, который имеет изменяемые строки, они предлагают новый тип данных: символы ("foo" vs.: foo, где первый является изменяемой строкой, а второй-неизменяемым идентификатором, часто используемым для ключей Hash).