Вы не можете легко определить, как статический и динамический размер контейнера в 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
.
Статическая или динамическая память? – soon
Статический и динамический – Deepak
Не будет 'sizeof (myVec)' достаточно, поскольку он получает размер элементов в нем тоже .... ??? – Xlander