2016-07-07 9 views
0

В запущенной программе, как я могу отслеживать/печатать количество памяти кучи, выделенного объектом?Есть ли способ распечатать объем памяти кучи, выделенный объектом?

Например:

#include <iostream> 
#include <vector> 

int main(){ 

    std::vector<int> v; 

    std::cout << heap_sizeof(v) << '\n'; 

    for (int i = 0; i < 1000; ++i){ 
    v.push_back(0); 
    } 

    std::cout << heap_sizeof(v) << '\n'; 
} 

Есть ли реализация, которая может заменить heap_sizeof()?

+0

В общем случае, только для конкретных платформ. Он очень привязан к реализации кучи. –

+0

Кому следует использовать значение shared_ptr <>? – lorro

+0

'std :: cout << sizeof (int) * v.capacity() << endl;' – GreatAndPowerfulOz

ответ

1

со всем, как он разработан из коробки, нет, это невозможно. У вас есть несколько вариантов для этого, хотя и по-своему.

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

Если вы хотите использовать эту возможность для всего, что выделено через new (будь то контейнер или нет), вы можете предоставить свою собственную реализацию operator new по глобальной и/или классовой основе и иметь (например) построить неупорядоченный карту от указателей до размеров блоков, чтобы указать размер любого выделенного блока (и с этим вам нужно будет предоставить функцию для извлечения этого размера). В зависимости от платформы это также может быть реализовано с использованием функций, специфичных для платформы. Например, когда вы создаете компилятор Microsoft (ну, на самом деле, библиотека), ваша реализация operator new не должна была бы ничего делать вообще, и функция для получения размера блока выглядела бы примерно так:

size_t block_size(void const *block) { 
    return _msize(block); 
} 

Еще одна возможность будет увеличивать размер распределения каждого запрашиваемого блока размером в целое число, достаточно большой, чтобы держать размер. В этом случае вы выделили бы больший фрагмент данных, чем запрошенный пользователем, и сохраните размер этого блока в начале возвращаемого блока. Когда пользователь запрашивает размер блока, вы берете правильное (отрицательное) смещение от указателя, которое они передают, и возвращают значение, которое вы там храните.

1

Во-первых, v выделяется в стеке, а не в куче.

Чтобы получить общий объем пространства, используемый она, я предлагаю использовать эту функцию: (Найден on this article и модифицирован немного)

template <typename T> 
size_t areaof (const vector<T>& x) 
{ 
    return sizeof (vector<T>) + x.capacity() * sizeof (T); 
} 

Если вы хотите, чтобы не рассчитывать размер самого std::vector объекта , то удалите часть с sizeof:

template <typename T> 
size_t heap_sizeof (const vector<T>& x) 
{ 
    return x.capacity() * sizeof (T); 
} 
+2

'V' может быть в стеке, но содержимое находится в куче. – GreatAndPowerfulOz

+0

Да, конечно. Я просто хотел указать, что v находится в стеке (в его примере). –

+0

Хорошо. Попался. Уточнено. – GreatAndPowerfulOz

0

Если вы не связаны с бухгалтерским учетом того, что каждый объект выделяет и больше озабочены тем, сколько памяти было выделено/освобожденный от до момента времени, вы можете использовать статистические функции таНос. Каждый malloc имеет свою собственную версию. В linux вы можете использовать mallocinfo().

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