Как определить размер объекта во время выполнения?
Мы не говорим о размер типа но фактический размер объекта, который может изменяться во время выполнения, например:
vector<int> v;
auto a = MagicSizeF(v); // magic size function
v.push_back(2);
v.push_back(2);
// this should hold - ok there's small consainer optimizations and initial
// vector capacity and implementation details, but you get what I mean
assert(MagicSizeF(v) > a);
В векторном случае это может быть реализовано так:
template<typename T>
auto MagicSizeF(vector<T> const& v) {
return v.size()*sizeof(T); // or v.capacity() to be strict
// other implementation details memory consumers could be added
}
но есть ли стандартный / универсальный способ сделать это для объектов произвольного типа? Нужен ли ABI для обхода всех деталей реализации?
Нет, универсального способа сделать это не существует, потому что вам понадобится универсальный способ идентификации указателей внутри объектов и определения размера их ссылок. Что если вы найдете пустоту *? Что если вы найдете указатель на массив? Вы даже не можете рассчитать размер этих вещей в некоторых случаях!