如何计算向量的大小

时间:2014-11-25 06:48:02

标签: c++ stl

我需要计算向量myVec所占用的内存(静态和动态); 我已按以下方式计算了尺寸

size = sizeof(myVec) * myVec.size();

我需要知道我所做的是否正确?

struct S1
{
  vector<int> v1;
  IplImage* image;
  vector<CvRect> rect;
};

struct S2
{
  vector<S1> var1;
  vector<int>  var2;
  IplImage* img1;
};

vector<S2> myVec;


//size = sizeof(myVec) * myVec.size(); ?????

2 个答案:

答案 0 :(得分:2)

您无法轻松确定C ++中容器的静态和动态大小,因为每个包含的实例都可以分配自己的内部内存(如注释中指出的@enhzflep)。

但是,如果您确实需要这样做,并且如果您知道可能要在容器中存储哪些类型,则可以使用模板为您组装最终算法。即,有些东西:

template<typename T>
struct compute_size {
    static unsigned of(const T& t) {
        assert(false && "not implemented");
        return 0;
    }
};

template<typename T>
struct compute_size<std::vector<T>> {
    static unsigned of(const std::vector<T>& v) {
        // static size
        unsigned result = sizeof(std::vector<T>);
        // static and dynamic size of all used elements
        for(auto& i : v)
            result += compute_size<T>::of(i);
        // account for allocated empty space
        result += (v.capacity() - v.size()) * sizeof(T);

        return result;
    }
};

template<>
struct compute_size<int> {
    static unsigned of(const int&) {
        return sizeof(int);
    }
};

template<>
struct compute_size<std::string> {
    static unsigned of(const std::string& s) {
        return sizeof(std::string) + s.capacity() * sizeof(std::string::value_type);
    }
};

通过功能模板使用:

template<typename T>
unsigned get_size(const T& val) {
    return compute_size<T>::of(val);
}

导致类似:

std::vector<std::string> qqq;
qqq.push_back("asdfasdf");
qqq.push_back("qwer");
std::cout << get_size(qqq) << std::endl;

有一些可能的优化,如:

// for PODs we don't really have to iterate
template<>
struct compute_size<std::vector<int>> {
    static unsigned of(const std::vector<int>& v) {
        return sizeof(v) + v.capacity() * sizeof(int);
    }
};    

并且,可能使用std::enable_if将其推广到整个类型组。

答案 1 :(得分:0)

静态尺寸:sizeof(vector<S2>)

动态尺寸:myVec.capacity() * sizeof(S2)