2015-01-19 4 views
-1

Внутри структуры, чтобы минимизировать заполнение, нужно объявить наименьшие элементы, исправить?C++ Размер std :: vector Смежный раздел

Std :: vector выделяет память на участке, который не обязательно смежный, правильный?

В структуре, сколько битов следует учитывать std :: vector при рассмотрении размещения в структуре по отношению к заполнению?

+2

*** std :: vector выделяет память на участке, который не обязательно смежный, правильный? *** Неверно. – drescherjm

+1

*** Внутри структуры, чтобы минимизировать заполнение, нужно объявить наименьшие элементы, исправить? *** Реализация определена. – drescherjm

+1

@ drescherjm: И, естественно, обратное нормально работает одинаково хорошо. – Deduplicator

ответ

1

Я предполагаю, что вы себе что-то вроде этого:

struct foo { 
    // ... 
    std::vector<T> vec; 
    // ... 
}; 

Я думаю, что вы пропустили это различие между самой std::vector объектом и памятью, она выделяет для своих элементов. Сам std::vector занимает sizeof(std::vector) байтов, поэтому будет вносить по меньшей мере это много байтов в структуру, в которой он содержится, если вы учитываете заполнение.

Внутренний объект std::vector выделяет смежную область памяти в другом месте, где хранятся элементы. Чтобы увеличить или уменьшить размер, std::vector может выделять различные размеры памяти при добавлении или удалении элементов. Однако это не имеет никакого отношения к вашему вопросу, поскольку эта память не вносит вклад в размер std::vector, а не от размера структуры, членом которой она является.

+0

Спасибо. На самом деле я был в замешательстве. Текила делает странные вещи для человека. Какое хорошее правило для определения sizeof (std :: vector) перед компиляцией, зная тип объекта, который он будет хранить, но не количество объектов? –

+0

@ Dr.McBucketO.ChickenM.D. Это полностью зависит от того, как это реализовано, поэтому вы не можете сказать. Однако тип элемента вряд ли будет иметь какой-либо эффект. –

4

Внутри структуры, чтобы минимизировать прокладку, следует объявить наименьшие элементы, исправить?

Это зависит. В некоторых случаях вы можете оптимизировать поведение кэша, что может не обязательно привести к упорядочению. В большинстве реализаций упорядочение вещей таким образом приведет к структуре наименьшего размера (с наименьшим количеством дополнений), но это не гарантируется стандартом или чем-то подобным.

БППП :: вектор выделяет память на участке, который не обязательно смежными, правильно?

Неправильное. vector требуется использовать один непрерывный участок. См. N3936 23.3.6.1/1:

A vector представляет собой контейнер последовательности, который поддерживает итераторы с произвольным доступом. Кроме того, он поддерживает (амортизируется) постоянное время вставки и стирания операций в конце; вставлять и стирать в середине, принимать линейное время. Управление хранилищем обрабатывается автоматически, хотя можно дать подсказки для повышения эффективности. Элементы вектора хранятся смежно, что означает, что если v является vector<T, Allocator>, где T - это некий тип, отличный от bool, то он соответствует идентификатору &v[n] == &v[0] + n для всех 0 <= n < v.size().

В пределах структуры, сколько бит следует рассматривать зЬй :: вектор будет при рассмотрении его размещения в пределах структуры относительно заполнения?

Vector ничего не видит о членах вашей структуры; он знает только размер.


Рассмотрим гипотетическую машину, которая имеет 4 байта int с и требует все быть 5 байт выравнивается. (Я не знаю такой машины, но стандарт написан таким образом, что такая машина будет возможно) В этом случае структура, как:

struct X 
{ 
    int a; 
    int b; 
    char c; 
    char d; 
}; 

будет тратить пространство, потому что

struct X 
{ 
    int a; 
    char c; 
    int b; 
    char d; 
}; 

будет содержать каждый из char s, сохраненный в неиспользованном 5 байт. Именно поэтому стандарт оставляет эту реализацию определенной.