Страницы

Поиск по вопросам

понедельник, 3 февраля 2020 г.

Сколько места занимает std::vector

#cpp #stl #vector


Интересует такой момент сколько места занимает std::vector int на 10x10 элементов в x64?

например просто std::vector на 10 значений занимает 24байта(сам объект) + 10x4байта(10
значений int) = 64байта, 

vector a (10,1);


соответственно 10x10 элементов будет занимать 24 + 24x10 + 10x10x4 = 664байта или
24 + 10x10x4 = 424байта?

vector> и (10,vector  (10,1));


Возник еще один вопрос, если я объявил вектор 

vector> b (10,vector  (10));


но заполнил допустим только один его элемент числом, например 

b[1][1] = 5;


остальные элементы второго вектора будут занимать 4 байта, или пока я не присвоил
им значение, то место занимает только структура вектора? соответственно размер 24 +
24x10 + 4 = 268, или в любом случае будет 664байта?
    


Ответы

Ответ 1



N*N vector> занимает sizeof(vector) + sizeof(vector)*N + sizeof(int)*N*N + α(N) где α(N) - накладные расходы на выделение памяти в хипе (хипу надо хранить сколько там выделено) sizeof(vector) - это обычно 3*sizeof(void*), и он не зависит от типа который хранится в векторе. (Теоретически возможен вектор меньшего размера, но так никто не делает).

Ответ 2



Размер вектора состоит непосредственно из памяти под структуру и выделенной памяти под массив. При том способе, каким ты создаёшь вектора, их вместимость будет фиксированной, т. е. равна тому числу элементов, которое ты запрашиваешь. Выделится сразу вся память, естественно. Исключением является vector, который должен держать значения в битах, а не байтах. В общем случае, насколько я помню, при использовании только операций добавления, можно рассчитывать, что вместимость вектора превосходит количество элементов в нём не более чем в 2 раза. При добавлении и удалении - в 4 раза. http://codepad.org/mTvWj83Z #include #include int main(void) { vector < vector > v(10, vector (10,1)); printf("%d + %d*%d + %d*%d", sizeof v, v.capacity(), sizeof v[0], v[0].capacity(), sizeof v[0][0]); printf(" = %d\n", sizeof v + v.capacity() * sizeof v[0] + v[0].capacity() * sizeof v[0][0]); return 0; } Выводит: 28 + 10*28 + 10*4 = 348

Ответ 3



Размер занимаемой памяти вектором зависит от конкретной реализации класса вектора и размера типа значения, Например размер типа int также может меняться в зависимости от среды, где запускается программа. Если запустить данную тестовую программу #include #include int main() { std::vector> v( 10, std::vector( 10 ) ); size_t size1, size2, size3; std::cout << "sizeof( std::vector> ) = " << ( size1 = sizeof( std::vector> ) ) << std::endl; std::cout << "v.capacity() * sizeof( vector ) = " << ( size2 = v.capacity() * sizeof( std::vector ) ) << std::endl; std::cout << "v[0].capacity() * sizeof( int ) = " << ( size3 = v[0].capacity() * sizeof( int ) ) << std::endl; std::cout << "Total occupied memory size1 + size2 + 10 * size3 = " << size1 + size2 + 10 * size3 << std::endl; } то онлайновый компилятор MS VC++ выдает следующие значения: sizeof( std::vector> ) = 12 v.capacity() * sizeof( vector ) = 120 v[0].capacity() * sizeof( int ) = 40 Total occupied memory size1 + size2 + 10 * size3 = 532 В то время как компилятор gcc 5.2.0 выдает следующий результат: sizeof( std::vector> ) = 24 v.capacity() * sizeof( vector ) = 240 v[0].capacity() * sizeof( int ) = 40 Total occupied memory size1 + size2 + 10 * size3 = 664 Как видите, даже при одинаковом размере типа int размер самого объекта типа std::vector разный для разных компиляторов. В VS VC++ этот размер равен 12 байтам, в то время как в gcc 5.2.0 он равен 24 байтам.

Комментариев нет:

Отправить комментарий