Каковы накладные расходы на пустой вектор?

Каковы накладные расходы памяти при наличии пустого вектора по сравнению с указателем на вектор?

Вариант А:

std::vector<int> v;

Вариант Б:

std::vector<int> *v = NULL;

Я полагаю, что вариант B занимает 1 32-битный указатель (при условии, что здесь 32 бита). Сколько памяти занимает пустой «v»?


person Community    schedule 17.02.2009    source источник
comment
Было бы неплохо узнать, что вы пытаетесь понять этим вопросом. Вы хотите создать из них массив и хотите знать, сколько места вы сэкономите, превратив его в массив указателей? Если это так, вероятно, есть некоторые другие проблемы, о которых вам следует знать.   -  person T.E.D.    schedule 17.02.2009


Ответы (6)


Что касается заданного вопроса: это зависит от реализации. С MSVC 7.1 это:

std:: cout << sizeof(std::vector<int>) << std::endl;

дает мне 16 (байт). (3 указателя: начало, конец и конец емкости плюс распределитель)

Однако следует отметить, что указатель на вектор увеличивает нагрузку:

  • и во времени, и в пространстве в непустом случае
  • по сложности во всех случаях.
person Éric Malenfant    schedule 17.02.2009
comment
@Legate: потому что вам нужно добавить размер самого указателя к размеру вектора - person Éric Malenfant; 26.01.2012
comment
@ÉricMalenfant: Но если инициализировать NULL, как в варианте вопроса B, вектор не будет построен, а с вариантом A вектор будет построен по умолчанию. - person Christoph Wurm; 26.01.2012
comment
@Легат: Да. Вот почему я написал в непустом случае - person Éric Malenfant; 26.01.2012
comment
Конечный указатель не сохраняется, а вычисляется во время выполнения: begin() + size(). - person Michael Smith; 09.03.2018
comment
@Michael Smith: реализация может выбрать сохранение размера и вычисление конца или наоборот. Важно то, что это зависит от реализации. - person Éric Malenfant; 10.03.2018
comment
@ÉricMalenfant Никакая реализация не сохраняет конец. Даже если они теоретически могут, они этого не делают и не имеют для этого веских причин. Если бы они это сделали, им пришлось бы пересчитывать его каждый раз, когда размер вектора изменяется. - person Michael Smith; 10.03.2018
comment
@Michael Smith: Кажется, есть: github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/ . - person Éric Malenfant; 10.03.2018

Это полностью зависит от реализации, и вы не должны ни предполагать, ни полагаться на детали. Что бы это ни стоило, это 20 байт с использованием VC.

person Andrew Grant    schedule 17.02.2009
comment
В GCC 4.6 это 12 байт. Я бы предположил 4 байта для указателя, 4 байта для размера и 4 байта для емкости. - person Joel; 22.04.2012

std::vector v; занимает sizeof(v) места. Это может варьироваться в зависимости от реализации, поэтому запустите его и узнайте, сколько это вам нужно.

person Welbog    schedule 17.02.2009
comment
А как насчет динамической памяти, используемой внутри вектора? - person Diego Sevilla; 17.02.2009
comment
Сконструированный по умолчанию вектор не имеет размера и никогда не имел его, поэтому он не должен иметь динамического распределения. - person Michael Burr; 17.02.2009

VS2005:

std::vector<int> *ptrToVec = new std::vector<int>();
std::vector<int> vecOfInt;

sizeof(ptrToVec) = 4
sizeof(vecOfInt) = 20

Спасибо!

person Community    schedule 17.02.2009

В Visual Studio Community 2017 (версия 15.2) запуск этого кода:

#include <iostream>
#include <vector>

using namespace std;

void main()
{
    vector<float> test;
    vector<float>* test2 = &test;
    cout << sizeof(test) << "\n";
    cout << sizeof(test2) << "\n";

    cout << "\n";
    system("pause");
}

Работая в 32-битном (x86), я получаю 16 байтов для вектора и 4 байта для указателя вектора.

Работая в 64-битном (x64), я получаю 32 байта для вектора и 8 байтов для указателя вектора.

person Andrew    schedule 08.07.2017

Зависит от реализации, вероятно, указатель и два целых числа для текущего размера и емкости.

person Community    schedule 17.02.2009