Как будет работать выравнивание памяти для следующей структуры, поскольку v - это динамически выделяемый объект? Является ли размер struct S постоянным, как и размер v? Так работает ли v по существу как указатель (или какая-то оболочка указателя)?
struct S {
ANY_TYPE a;
std::vector<ANY_TYPE> v;
} s;
Если на все вышеперечисленные вопросы ответ положительный, то в зависимости от размера v, где хранится память его членов? Считается ли это памятью в куче или в стеке?
Обновлено: я вижу отрицательные ответы на этот вопрос и понял, что мне нужно было больше исследовать сам std :: vector. Я прочитал этот Почта, который все прояснил. Спасибо за ответы!





v определенно является оболочкой как минимум указателя и (в зависимости от реализации) некоторого другого учета. Размер v в стеке (или в массиве) будет ограничен только теми членами, которые объявлены непосредственно в классе std::vector, и да, это означает, что размер v и, следовательно, размер экземпляров S будет постоянным. .
Количество использованных байтов от имениv (и экземпляров S) будет зависеть от того, сколько памяти куча выделяется v в ходе его создания и срока службы.
Какая память используется для непосредственных членов S (включая v), определяется кодом, выполняющим объявление:
void my_func() {
S s1; // `s1` and its members `a` and `v` are all on the stack
// ...though `v` will allocate heap memory for its own use
S* s2 = new S; // `s2` points to a heap-allocated instance of `S`
v не выделяется динамически. Сам std::vector является частью объекта S. v, однако, делает собственный динамически выделяемым буфером.
Это означает, что sizeof(S) постоянен. Всегда будет sizeof(ANY_TYPE) + sizeof(std::vector<ANY_TYPE>) + padding.
По сути, S будет размещен в памяти примерно так (возможно, с некоторым дополнением между a и v для сохранения выравнивания):
S
+---+
| |
| a |
| |
+---+
| |
| v | dynamically allocated buffer
| | +------+------+-----+
| +----> v[0] | v[1] | ... |
| | +------+------+-----+
+---+
Спасибо за лаконичный и полезный ответ! Итак, могу ли я понять источник стрелки влево на вашем рисунке как указатель, заключенный в объект v?
Да, std::vector обычно содержит указатель на первый элемент своего динамически выделяемого буфера. (Обычно в него входят два других члена: его текущий размер и вместимость).
Возможный дубликат Когда векторы выделяются, используют ли они память в куче или стеке?