Как эти множественные адреса в действительности содержатся в 1 указателе?
Будет ли указатель разделен на несколько адресов? Вы
знать, какой компонент в компьютере на самом деле идентифицирует и назначает
фактический адрес "коды"?
С точки зрения программиста (обратите внимание на это), указатель на себя, как правило, представляет собой 4-байтовое число, представляющее смещение от начала памяти (32-разрядные, в 64-разрядных вы можете иметь адреса до до 8 байт). Дело в том, что эти указатели указывают на начало того, что хранится , и все.
Например, в C исходные строки использовали завершенные строки NULL (\ 0), чтобы определить, когда заканчивается строка (Попробуйте выполнить printf()
на C с ненулевой строкой, и она напечатает все, что находится в память пока не найдет ноль). Это, конечно, довольно опасно, и нужно использовать такие функции, как strncpy
(обратите внимание на «n»), указывающие, что вы должны вручную вводить число символов в смещении до его окончания.
Способ обойти это - сохранить используемое пространство в начале адреса памяти, что-то вроде
struct
{
int size;
char *string;
}string;
Это хранит размер, чтобы предотвратить любые проблемы. Objective-C и многие другие более абстрактные языки по-своему реализуют способы обработки памяти. NSString*
- довольно абстрактный класс, чтобы знать, что происходит за кулисами, он, вероятно, наследует всю свою память, управляющую от NSObject
.
Все, что я пытаюсь получить, это то, что указатель содержит начальный адрес, и вы можете переходить от байта к байту оттуда (или переходы определенного размера), сохраняя в имейте в виду общую длину того, что вы храните, чтобы избежать таких неприятных вещей, как переполнение стековой памяти (отсюда и название этого сайта).
Теперь то, как компьютер выдает эти адреса, полностью зависит от операционной системы, и ваш адрес логической памяти, который вы используете во всех своих программах, совершенно отличается от того, что использует базовая реализация (адрес физической памяти). Как правило, вы обнаружите, что память хранится в сегментированных единицах, называемых «кадрами», а используемый кадр называется « page ». А отображение между физическим и логическим осуществляется с помощью «[Page Table]» 2 .
Как вы можете видеть, программное обеспечение обрабатывает почти все, но это не значит, что не существует аппаратного обеспечения, поддерживающего это, например, TLB , кэш уровня процессора, который содержит последние адреса памяти для быстрого доступа.
Также, пожалуйста, примите мой ответ с крошкой соли, я давно изучал эти предметы.
ОК, мой вопрос; Я задавался вопросом, что действительно происходит, когда вы выпускаете
указатель [sPointer release]; вы на самом деле отпускаете указатель
(содержащий адрес), или вы также освобождает фактическую строку
переменная "из памяти? Я узнал, что когда вы удаляете
ссылка, память, где хранится фактическая переменная будет просто
перезаписывается в тот момент, когда компилятору нужна память, поэтому он не нуждается
быть очищенным в это время. Это неправильно? Если это правильно, зачем
говорят, что очень важно освободить указатель NSString
по соображениям производительности, если вы просто отпустите указатель, который будет
в основном содержат только несколько байтов? Или я не прав, а это память
где фактическая переменная хранится на самом деле также очищается сразу с
сообщение "релиз"?
Когда вы отпускаете, вы просто уменьшаете количество памяти объекта. То, что вы имеете в виду, это то, что происходит, когда он освобожден (когда счет достигает нуля).
Когда вы dealloc
что-то делаете, вы в основном говорите, что пространство, где оно было зарезервировано, теперь может быть свободно заменено чем-то еще, запрашивающим память (через alloc). Переменная может по-прежнему указывать на освободившееся пространство, и это вызывает проблемы (Читайте о висячих указателях и утечках).
Память может быть может быть очищена, но есть без гарантий .
Я надеюсь, что это устранит все сомнения, так как все они порождаются вашей путаницей в отношении освобождения памяти.
И, наконец, также: примитивные типы данных не освобождаются, но они "занимают" место в памятина момент объявления (но не более общего указателя).Почему бы нам не отпустить их на самом деле?Что мешает нам делать что-то вроде: int i = 5, за которым следует [i release]?;
Дело в том, что у С есть две основные цели (на самом деле, намного больше): куча, котораяхранит память, которая была запрошена с помощью alloc (или malloc в C), и они требуют освобождения.И стек, который содержит локальные переменные, которые умирают, когда функция / блок завершается (в стеке появляется вызов функции).
В вашем примере переменная i
была локально объявлена в своей области видимости, иэто ограничено в стеке.Попытка выполнить dealloc / free (также переменная, которую я не буду отвечать на release, или dealloc, поскольку это не объект) не будет работать, так как это не тот тип памяти, который требуется освободить.
Я предлагаю вам вернуться к C, прежде чем пытаться разобраться с тем, что делает Objective-C, потому что трудно иметь четкое представление о том, как императивное программирование работает со всеми хорошими абстракциями, такими как release и dealloc.