Строго говоря, в соответствии со стандартом объект не обязательно должен находиться в стеке или куче. Стандарт определяет 3 типа «длительности хранения», но не указывает, как именно должно быть реализовано хранение:
- продолжительность статического хранения
- продолжительность автоматического хранения
- продолжительность динамического хранения
Автоматическая продолжительность хранения обычно (почти всегда) реализуется с использованием стека.
Продолжительность динамического хранения обычно реализуется с использованием кучи (в конечном итоге через malloc()
), хотя это может быть переопределено даже пользователем компилятора.
Длительность статического хранения — это то, что обычно называют глобальными (или статическими хранилищами).
В стандарте говорится об этих вещах (ниже приведены выдержки из различных битов 3.7 - Продолжительность хранения):
Статическая и автоматическая продолжительность хранения связаны с объектами, введенными объявлениями (3.1) и неявно созданными реализацией (12.2). Длительность динамического хранения связана с объектами, созданными с помощью оператора new (5.3.4).
...
Все объекты, которые не имеют динамической продолжительности хранения и не являются локальными, имеют статическую продолжительность хранения. Хранение этих объектов должно продолжаться в течение всего времени работы программы (3.6.2, 3.6.3).
...
Локальные объекты, явно объявленные как auto или register, или не объявленные явно как static или extern, имеют автоматический срок хранения. Хранилище для этих объектов длится до тех пор, пока блок, в котором они созданы, не выйдет.
...
Объекты могут создаваться динамически во время выполнения программы (1.9), с использованием выражений new (5.3.4) и уничтожаться с помощью выражений удаления (5.3.5). Реализация C++ обеспечивает доступ к динамическому хранилищу и управление им с помощью глобальных функций выделения памяти оператора new и оператора new[] и глобальных функций освобождения памяти оператора delete и оператора delete[].
...
Библиотека предоставляет определения по умолчанию для функций глобального выделения и освобождения. Некоторые глобальные функции выделения и освобождения заменяемы (18.4.1).
И, наконец (относительно массива в вашем примере класса):
3.7.4 Продолжительность подобъектов [basic.stc.inherit]
Продолжительность хранения подобъектов-членов, подобъектов базового класса и элементов массива равна продолжительности их полного объекта (1.8).
person
Michael Burr
schedule
09.01.2009