Есть ли способ получить размер байтов векторов только через один тип? - PullRequest
2 голосов
/ 12 октября 2009

Как я могу предсказать размер вектора?

#include <vector>
#include <iostream>
using namespace std;

int main() {
    cout << sizeof(vector<char[8]>) << endl;
    cout << sizeof(vector<char[16]>) << endl;
    return 0;
}

[starlon@localhost LCDControl]$ ./test 
12
12

Ответы [ 5 ]

12 голосов
/ 12 октября 2009

Поскольку vector<> сам по себе является классом, который осуществляет собственное управление динамической памятью, использование оператора sizeof для запроса его размера не очень важно. Я подозреваю, что вы обнаружите, что значение, которое вы вычисляете выше, всегда будет 12.

Вы можете спросить вектор, сколько элементов он содержит, используя метод .size(). Кроме того, метод .capacity() скажет вам, сколько элементов имеет фактически выделенной памяти (даже если они еще не используются).

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

3 голосов
/ 12 октября 2009

sizeof всегда возвращает размер объекта / типа первого уровня. Он не пытается измерить объем памяти, на который указывает объект в других местах. 12 байтов, которые возвращает sizeof, отражают размер элементов данных вектора. Одним из этих членов является указатель, который указывает на фактические данные.

1 голос
/ 12 октября 2009

Существует метод с именем size ()
Это говорит вам, сколько элементов содержится внутри.
Но размер объекта не будет отражать это, так как он просто содержит указатель на действительные данные.

Кстати, вы объявляете векторы массивов char. Это то, что вы действительно хотите?

Также это:

std::cout << std::vector<X>(Y) << "\n";

Должен (вероятно) всегда возвращать одно и то же значение, независимо от того, что X или Y.

0 голосов
/ 04 июля 2013

В других ответах объясняется, почему вы не можете использовать sizeof напрямую при попытке. Однако вы можете использовать sizeof, чтобы получить то, что вы ищете следующим образом:

vector<int> my_vector;

// Push some stuff here
// ...

cout << my_vector.size() * sizeof(int) << endl;

my_vector.size () вернет вам размер в элементах . Затем вы используете sizeof (элемент), чтобы получить размер в байтах каждого элемента в массиве. Их продукт - это ответ, который вы ищете.

0 голосов
/ 12 октября 2009

Что вы хотите сделать точно, вы хотите знать, сколько памяти занимает std::vector, который содержит 8 или 16 char с?

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

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

...