2016-06-02 7 views
1

Существует простой C++ классИспользование SizeOf для классов

class LASet 
{ 
    public: 
    long int maxValue, minValue; 
    int _count; 
    set <long int> _mySet; 
    LASet() 
    {   
     maxValue = 0; 
     _count = 0; 
     minValue =std::numeric_limits<long int>::max(); 
     _mySet.clear(); 
    } 
    void Add(long int value) 
    {        
     if (_mySet.find(value) != _mySet.end()) 
      return; 
     if (value > maxValue) 
      maxValue = value; 
     if (value < minValue) 
      minValue = value; 
     _mySet.insert(value); 
     _count++; 
    } 
    // some helper functions.... 
}; 

Как я инстанцирует некоторые объекты этого класса, я хочу, чтобы найти их размеры во время выполнения. Итак, я просто написал sizeof после многих циклов выполнения для каждого объекта. Например:

LASet LBAStartSet; 
... 
... 
cout << "sizeof LBAStartSet = " << sizeof(LBAStartSet) << '\n'; 

Это cout линия отчеты только 72 для всех объектов означает 72В, но top команда показывает 15 Гб памяти.

Я прочитал руководство по адресу cppreference, что sizeof не работает над некоторыми неполными типами данных. Является ли мой тип данных неполным?

Любая обратная связь приветствуется.

+2

'sizeof' не делает то, что вы думаете, что он делает ... перечитайте эту страницу руководства. Ваш тип не является неполным –

+0

Чтобы помочь вам понять, помните, что 'sizeof' разрешен во время компиляции –

+0

sizeof() - это оператор времени компиляции. Ваш тип завершен. Как я вижу из вашего кода, который вы использовали «set», и если я не ошибаюсь, вы добавляете данные в этот набор во время выполнения. Sizeof() не вернет вам размер во время выполнения, он даст размер вашего класса, вычисляя типы элементов данных во время компиляции. top покажет вам фактическое использование памяти во время работы (резидентная память). – sagar

ответ

2

Поскольку я создаю экземпляр некоторых объектов этого класса, я хочу найти их размеры во время выполнения.

Предполагается, что размер объекта может измениться во время выполнения. Это невозможно. Размер объекта во время компиляции одинаковый, так же как и во всей рабочей среде. После компиляции он не изменяется.

Является ли мой тип данных неполным?

Нет. Если бы это было так, то ваша программа была бы плохо сформирована, и компилятор, скорее всего, откажется компилировать. Тип является неполным, если он объявлен, но не определен. Вы определили LASet, так что оно завершено.

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

Таким образом, память, используемая вашей программой примерно:

sizeof LBAStartSet 
+ LBAStartSet._mySet.size() * (sizeof(long) + overhead_of_set_node + padding) 
+ overhead_of_dynamic_allocation 
+ static_objects 

Статические объекты включают в себя такие вещи, как std::cout. Накладные расходы на динамическое распределение зависят от реализации, но это может быть O (n) в количестве динамически распределенных объектов.

Я хочу отслеживать рост размера данных во время выполнения. Есть ли способ найти это?

Не в стандартном C++. Но существуют конкретные способы ОС.В Linux, например, существует псевдо-файловая система /proc, и вас может заинтересовать содержимое /proc/self/status

0

Я думаю, проблема в члене _myset. Это объект, а sizeof (LASet) не увеличивается при вставке значений в _myset. Вероятно, sizeof (LAset) оценивается во время компиляции.

Вы можете использовать set :: size, чтобы узнать, сколько элементов в наборе. Если вы сделаете это для всех экземпляров LASet, вы можете получить грубую аппроксимацию необходимой памяти.

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