Нестатические члены данных хранятся внутри объекта (экземпляра класса), частью которого они являются.
Если вы создаете объект как локальный с автоматическим хранением, его члены
внутри него. Если вы выделяете объект динамически, они внутри него.
Если вы выделяете объект с использованием совершенно другой схемы размещения, его члены все равно будут находиться внутри него, где бы он ни находился. Члены объекта являются частью этого объекта.
Обратите внимание, что здесь экземпляр vector
находится внутри вашей структуры, но сам vector
управляет собственным динамическим хранилищем для элементов, которые вы помещаете в него. Таким образом, экземпляр abc
динамически размещается в обычном свободном хранилище с его элементом vector
внутри, а 42
находится в отдельном динамическом размещении, управляемом экземпляром vector
.
Например, скажем, вектор реализован так:
template <typename T, typename Allocator = std::allocator<T>>
class vector {
T *data_ = nullptr;
size_t capacity_ = 0;
size_t used_ = 0;
// ...
};
затем capacity_
и used_
являются частью вашего векторного объекта. Указатель data_
также является частью объекта, но память, управляемая вектором (и , указанная на на data_
), не является.
Примечание по терминологии:
- с продолжительностью автоматического хранения изначально в стеке . Как указывает Локи (а я упомянул себя в другом месте ), автоматическое локальное хранение часто реализуется с использованием стека вызовов, но это деталь реализации.
- динамически изначально был в куче - применимо то же самое возражение.
- Когда я говорю обычный бесплатный магазин , я имею в виду независимо от ресурса, которым управляет
::operator new
. Там может быть что угодно, это еще одна деталь реализации.