переменная-член класса требует больше памяти: изменения адреса?

Я предполагаю, что мой вопрос не требует минимального рабочего примера; это возможно легко и легко описать.

Предположим, что есть экземпляр класса, в котором в качестве членов хранятся некоторые объекты. Теперь один из членов растет во время выполнения. После создания экземпляра member1 потребляется 10 байт, а member2 — 20 байт. Затем object1 каким-то образом модифицируется, и теперь ему требуется 15 байт.

Мой вопрос в том, не изменился ли адрес (первый байт) member1? Или потенциально возможно, что первый байт member1 теперь имеет другой адрес, как раньше? Выделяются ли переменные-члены в куче?

Спасибо за ваш отзыв!

Лучший


person Simon    schedule 07.07.2021    source источник
comment
Объекты не могут изменять размер в С++. Это может вам помочь: поддерживает ли stdvector непрерывную память для пользовательских объектов неизвестного размера"> stackoverflow.com/questions/55478523/   -  person NathanOliver    schedule 07.07.2021
comment
не требует минимального рабочего примера; извините, но вы ошибаетесь в этом, т.к. теперь один из членов растет во время выполнения. является неправильной интерпретацией некоторого кода. Мы не знаем, что это за код, пока вы его не покажете.   -  person 463035818_is_not_a_number    schedule 07.07.2021
comment
Если что-то динамически растет во время выполнения, вероятно, задействовано выделение кучи. Хотя это можно абстрагировать с помощью таких вещей, как string, vector, map и т. д. Но в основном именно так вы получаете вещи, которые могут расти. Если это кажется расплывчатым, вам нужен более конкретный вопрос/пример.   -  person TheUndeadFish    schedule 07.07.2021
comment
У меня есть экземпляр класса, члены которого взяты из внешней библиотеки, я даже не знаю, как они внутренне хранят элементы. Но я кое-что проверил: адрес члена не изменился, но его потребление памяти увеличилось во время выполнения. Так что это возможно только с использованием распределения кучи, не так ли?   -  person Simon    schedule 07.07.2021


Ответы (1)


Теперь один из членов растет во время выполнения.

Этот сценарий невозможен в C++. Размер объекта (и размер типа) постоянен во время выполнения.

member1 теперь имеет другой адрес, как раньше?

Нет. Адрес объекта никогда не изменится на протяжении всей его жизни.

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

Тип переменной-члена должен быть полным. Это означает, что тип должен быть определен. Если он определен, то его размер и внутренние члены известны. Вероятно, вы включили определение типа, включив заголовочный файл. Вы можете прочитать этот заголовок, чтобы узнать определение.

Так что это возможно только с использованием распределения кучи, не так ли?

Не обязательно. Например, может быть предварительно выделенный буфер, который может содержать объекты до некоторого постоянного предела.

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

person eerorika    schedule 07.07.2021
comment
Нет. Адрес объекта никогда не изменится на протяжении всей его жизни. Просто чтобы быть уверенным, адрес объекта и, следовательно, адреса всех членов не меняются, верно? - person Simon; 07.07.2021
comment
Члены данных @Simon также являются объектами (если только они не являются ссылками), и это относится ко всем объектам. (Ссылки не являются объектами и не имеют адреса — или, по крайней мере, любого адреса, к которому вы можете получить доступ в языке C++. Кроме того, ссылочные элементы используются довольно редко). - person eerorika; 08.07.2021