C ++ структура памяти для std :: vector - PullRequest
0 голосов
/ 19 сентября 2018

Для следующей структуры, поскольку v - это динамически распределенный объект, как будет работать выравнивание памяти?Является ли размер struct S постоянным, даже если размер v идет?Так работает ли v как указатель (или как-то вроде обертки для указателя)?

struct S {
    ANY_TYPE a;
    std::vector<ANY_TYPE> v;
} s;

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

Редактировать: Я вижу отрицательные отзывы на этот вопрос и понял, что должен был провести больше исследований самого std :: vector.Я прочитал этот пост , в котором все ясно.Спасибо за ответы!

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

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] | ... |
|   |  +------+------+-----+
+---+
0 голосов
/ 19 сентября 2018

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` 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...