2009-02-17 2 views
23

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

Вариант А:

std::vector<int> v; 

Вариант B:

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

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

+0

Было бы неплохо узнать, с чем вы пытаетесь справиться с этим вопросом. Вы хотите создать массив из них и хотите знать, сколько места вы сохраняете, создавая массив указателей? Если это так, возможно, есть некоторые другие проблемы, о которых вы должны знать. –

ответ

0

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

5

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

+0

А как насчет динамической памяти, используемой внутри вектором? –

+1

По умолчанию построенный вектор не имеет размера и никогда не имел, поэтому он не должен иметь динамического распределения. –

12

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

+0

На GCC 4.6 это 12 байт. Я бы предположил 4 байта для указателя, 4 байта для размера и 4 байта для емкости. – Joel

31

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

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

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

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

  • как во времени и пространство в непустом случае
  • по сложности во всех случаях.
+3

Ур последняя точка очень хорошая. +1 для этого –

+0

Почему указатель на вектор имеет большие накладные расходы? –

+0

@Legate: из-за того, что вы должны добавить размер самого указателя к размеру вектора –

3

VS2005:

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

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

Спасибо!

1

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