Какова накладная стоимость пустого вектора? - PullRequest
26 голосов
/ 17 февраля 2009

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

Вариант А:

std::vector<int> v;

Вариант B:

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

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

Ответы [ 6 ]

32 голосов
/ 17 февраля 2009

Что касается вопроса, который задают: это зависит от реализации. С MSVC 7.1 это:

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

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

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

  • во времени и пространстве в непустом случае
  • по сложности во всех случаях.
12 голосов
/ 17 февраля 2009

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

5 голосов
/ 17 февраля 2009

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

3 голосов
/ 08 июля 2017

В 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 байтов для векторного указателя.

3 голосов
/ 17 февраля 2009

VS2005:

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

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

Спасибо! * * 1004

0 голосов
/ 17 февраля 2009

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

...