2013-07-16 4 views
-3

Память может быть разделена на 4 области.Где хранится метод класса и класса?

Первый - это стек, второй - куча, третий - код, а последний - данные.

Интересно, где хранится метод класса и класса.

Не могли бы вы объяснить это?

+0

Если моя память служит мне хорошо, это зависит от контекста, в котором вы относитесь к слову «память». –

+0

Если вы хотите разделить память на эти конкретные области (не уверен, насколько это точно), классы, вероятно, являются «кодом». – Thilo

+0

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

ответ

0

Определение класса хранится в разделе кода программы (если вы думаете об этом, это имеет смысл, поскольку определение является эффективным набором функций, которые концептуально принимают объект в качестве дополнительного параметра с именем «this «). Тем не менее, каждый экземпляр виртуального класса должен содержать указатель на свою виртуальную таблицу (чтобы иметь возможность выполнять динамическую отправку), и он будет находиться там, где этот экземпляр будет выделен (что для виртуального случая обычно будет быть в куче).

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

2

Предостережение: в теории части этого ответа могут широко варьироваться (хотя на самом деле существует справедливый уровень единообразия по крайней мере в большинстве типичных/общих реализаций). Таким образом, части этого ответа основываются на принципе того, что вы обычно можете ожидать, хотя возможны и другие варианты.

«Методы» (функции-члены) - это код, расположенный с другим кодом. Основное отличие от других функций состоит в том, что функция-член обычно ожидает получить скрытый параметр (называемый this), который дает ему адрес любых данных объекта (включая, косвенно, указатель vtable класса).

Расположение данных класса обычно зависит от того, как распределяется объект класса, как и любая другая переменная: глобальный или статический локальный объект будет выделяться статически (из вашего списка, по-видимому, «данные»,); локальная автоматическая переменная будет выделена автоматически (иначе говоря, «в стеке»), и динамически распределенная переменная будет выделена (большой сюрприз) динамически (иначе, «в куче»).

Конечно, можно немного согнуть эти правила - например, переменная-член static будет назначаться статически, независимо от того, как распределяется остальная часть объекта.

0

Методы не занимаются хранением экземпляров. ООП создает иллюзию определенного метода - это объект-член класса, но это всего лишь парадигма, на самом деле вы можете думать о методах-членах как глобальных функциях, которые видны только в области объектов, с которыми они связаны ».

Вкратце, метод C++-члена SomeType.someMethod() идентичен структуре C SomeType и сопровождающему SomeType_someMethod(SomeType* self), что и автоматически генерирует компилятор C++.

Единственными частями класса, которые фактически занимают пространство данных экземпляра, являются нестатические типы членов. Таким образом, методы-члены логически занимают части памяти «код» и «данные», поскольку именно этот метод - список инструкций и ссылок на глобальные и локальные объекты в памяти.

Поскольку C++ допускает рекурсию и все остальные «динамические функции», каждый экземпляр функции создает свои собственные локальные объекты, поэтому нестатические и неконстантные локальные автоматические элементы копируются из глобальной памяти в стек, либо в виде мгновенных значений или ссылок на глобальные статические данные.Это относится только к неконстантным данным локального члена, метод не меняет его инструкций, поэтому, в отличие от локальных, необходим только один экземпляр кода метода.

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

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

+0

«нестатические и неконстантные члены метода копируются из глобальной памяти в стек». Это не то, что происходит. Если под «членами метода» вы подразумеваете элементы данных объекта, они не копируются в стек. Они доступны (через указатель 'this'), где бы они ни находились; это может быть в стеке (если объект имеет автоматическое хранилище) или где-то еще. С другой стороны, если под «членами метода» вы подразумеваете локальные переменные: они строятся прямо в стеке. Не требуется копирование из «глобальной памяти». – jogojapan

+0

@jogojapan - Я не имею в виду элементы данных класса, я имею в виду «члены» метода-члена, например. локальные автоматические объекты. И вы говорите: «составлены прямо на стеке», но, учитывая, что они в основном исходят из непосредственных значений, они на практике копируются из памяти программы в стек, что я и имел в виду. Не похоже на явный «memcpy». – dtech

+0

Как инициализируется локальная переменная, зависит от того, как она инициализируется. Они могут быть скопированы из других локальных объектов или из объектов где-то в куче. – jogojapan

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