2015-12-18 5 views
2

Я читал, что стеки используют для управления вызовами функций, где кучи используются для хранения выделенных объектов. Я понял, что объекты не примитивного типа будут храниться в куче. Я запутался в следующих случаях в случае стека & куча:Уточнение в стеке и куче

1) Где примитивные типы данных, MACROS (#define), статические объекты, const и extern?
2) Стеки управляют вызовами функций, но я хотел бы знать, какая информация, связанная с функциями, нажата на стек?
3) Я где-то читал, что связанные с работой локальные объекты хранятся в стеке. Итак, если какое-либо распределение объектов происходит внутри функции, используется стек или куча? И если какие-либо объекты примитивных типов объявлены внутри функции, где они хранятся?

Sree.

ответ

1
  1. Макросы разрешаются во время компиляции. Consts, globals и т. Д. Являются частью сегмента данных, а не стек или куча. https://en.wikipedia.org/wiki/Data_segment

  2. Всякий раз, когда вы вызываете функцию, ее параметры вставляются в стек.

  3. Все примитивы, локальные переменные и т. Д. Внутри функции выделяются в стеке.

В упрощенных выражениях компилятор вычисляет, сколько памяти требуется каждой функции (общая сумма всех ее переменных). Когда функция вызывается, размер просто добавляется в стек, а затем вычитается, когда он будет завершен.

На самом примитивном уровне используется единственная временная память кучи (исключая библиотеки), когда вы вызываете malloc.

В случае Objective-C практически каждый объект выделяется динамически в куче всякий раз, когда вы вызываете alloc или new. Objective-C разработан таким образом, и распределение кучи является нормальным. C и C++ имеют тенденцию использовать динамическое распределение на куче меньше.

+0

2 может быть или не быть правильным, это, безусловно, неверно с 64-битным C ABI (за исключением вариационных функций) –

+0

@GradyPlayer означает, что компилятор может не копировать его? –

+0

Что делать, если примитивные типы объявлены в заголовке? Точно, какой контент хранится в стеке во время вызовов функций? Если функция содержит несколько параметров, то как они перетаскиваются в стек? –

1

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

То, что вы найдете там следующее:

  1. Макросы должны быть оценены во время компиляции, а не во время выполнения.
  2. Константы, глобалы и статические объекты объявляются константами и сохраняются в самом исполняемом файле.
  3. Первичные переменные или указатели данных сохраняются в регистры процессора (очень быстрые, но ограниченные по количеству) или хранятся в фрейме стека в памяти (больше места, но примерно на 1000 раз медленнее). Чтобы понять фреймы стека, вы должны посмотреть на this explanation. В основном кадр стека создается путем перемещения указателя стека (который указывает на место памяти, где новые значения помещаются в стек) вниз (стек растет с больших адресов памяти на более мелкие), поэтому в стеке есть неиспользуемое пространство, которые могут быть локально использованы во время функции.
  4. Если вы вызываете функцию, обратный адрес (указатель инструкции перед вызовом + 1) помещается в стек, поэтому, когда функция возвращается, выполнение переходит к обратному адресу, вызывая обратный адрес из стека и прыгая к нему.
  5. Если в вашей функции много аргументов, аргументы 7, 8 и т. Д. Хранятся в стеке до вызова функции. Все предыдущие аргументы хранятся в регистрах
  6. В отличие от стека, пространство кучи назначается системой и доступно только (насколько мне известно), прерывая программу и позволяя операционной системе назначать память программе (что произойдет внутри вызова malloc). По мере выделения объектов ([NSObject alloc]) они могут быть найдены в памяти кучи.

Резюме

  • Примитивные значения и структуры сохраняются рядом адресов возврата из вызовов функций в стеке
  • большие выделения памяти выше на несколько байт выполнены в кучного пространстве. Сюда входят объекты и массивы, созданные с помощью malloc.

 Смежные вопросы

  • Нет связанных вопросов^_^