2014-08-28 4 views
0

Как определить размер среды выполнения объекта?C++ Динамический размер объекта

Мы не говорим о size of the type, но фактический размер объекта, который может изменяться во время выполнения, например:

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 обойти все детали реализации?

+2

Не связанный с вашим фактическим вопросом, но небольшая оптимизация буфера невозможна с помощью 'std :: vector', потому что' swap() 'не разрешено отменять итераторы. – Praetorian

ответ

4

Нет, нет общего способа сделать это, потому что вам понадобится общий способ определения указателей внутри объектов и определения размера их референтов. Что, если вы найдете пустоту *? Что, если вы найдете указатель на массив? Вы даже не можете рассчитать размер этих вещей в некоторых случаях!

+3

Кроме того, вы не можете сказать, что объект, на который указывает, фактически принадлежит объекту, на который он указывает. Если вы следуете каждому указателю, с которым вы сталкиваетесь, и суммируйте найденные вами элементы, вы получите бесконечный размер, когда у вас есть два объекта, указывающих друг на друга. Если вы сомневаетесь в том, чтобы избежать двойного подсчета объектов, «MagicSize» листа все равно будет размером с весь * лес *, который обычно не является тем, что вам нужно, и делает эту функцию довольно бесполезной. –

+0

@ArneMertz: совершенно верно. Вопросы очень напоминают те, которые подробно обсуждались неподражаемым Раймондом Ченом, здесь: http://blogs.msdn.com/b/oldnewthing/archive/2004/12/28/336219.aspx –

Смежные вопросы