Подтвердить что ты не робот

Что такое запись активации в контексте C и С++?

Что это значит и как важно знать об этом для программистов на C/С++?

Является ли он одинаковым на всех платформах, по крайней мере концептуально?

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

Я хочу узнать больше

4b9b3361

Ответ 1

Активационная запись - другое имя для Stack Frame. Это структура данных, составляющая стек вызовов. Обычно он состоит из:

  • Местные жители вызываемого лица
  • Обратный адрес вызывающего абонента
  • Параметры вызываемого абонента

Таким образом, стек вызовов состоит из любого количества записей активации, которые добавляются в стек при добавлении новых подпрограмм и удаляются из стека (обычно) по мере их возврата.

Фактическая структура и порядок элементов определяются платформой и даже реализацией.

Для программистов на C/С++ общие знания этой структуры полезно понимать некоторые функции реализации, такие как Calling Conventions и даже почему переполнение буфера позволяет запускать вредоносный код третьей стороны.

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

В более общем плане, программист на C/С++ может пойти на большую часть своей карьеры программистов-любителей, даже не подумав о том, чтобы вызвать стек вызовов.

Ответ 2

Активационная запись не является понятием, которое используется в разговорах о самих языках C или С++. Формат записей активации очень специфичен для платформы.

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

Ответ 3

Когда мы вызываем функцию, нам нужно какое-то место для хранения вызовов и контекстов вызовов, это место называется активационной записью (кадр стека AKA).

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

Вы можете задаться вопросом "Любые примеры?".

  • Разумеется, просто взгляните на бесконтактный дизайн мэйнфреймов IBM, стек недоступен, его активационная запись основана на куче.
  • Напротив, есть также платформа, которая не обеспечивает кучу (AKA без кучи), например Arduino (но это также означает, что нельзя использовать новое ключевое слово и новое выражение).
  • Помимо ограничения аппаратного обеспечения, некоторые функциональные языки не могут хранить локальные переменные в стеке, поэтому их записи активации выделяются в куче, если вам интересно, причина здесь хорошая.

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

Ответ 4

Запись активации содержит следующие три вещи:

1. Определение функции
2.Варифное определение
3.Функция приложения (вызов функции)