zoo
и где оно инициализируется? всмысле безотносительно?
map<string, unsigned int>
std::map
работает с динамической памятью. Твой код уже на этом этапе рискует провалиться в рекурсию. Чтобы это сучилось, тебе будет достаточно перегрузить глобальный new
и внутри перегрузки попробовать использовать мониторинг памяти.std::map
при доступе к элементам только усложняет весь этот процесс.std::map
на std::unordered_map
, которая реализует хэш-таблицу для хранения элементов.MemoryMonitor()
{
allocaledMemorySize = 0;
AllocationCount = 0;
}
MemoryMonitor memoryMonitor;
template<typename T, typename... Args>
T* Malloc(Args&&... args)
memoryMonitor
в тот момент, когда произойдет попытка вызвать Malloc
до входа в главную функцию программы.string typeName = typeid(T).name();
std::string
является еще одним потребителем динамической памяти. В этом месте ты добавляешь очень много накладных расходов на одну простую аллокацию памяти. Буквально, из одной аллокации ты делаешь, как минимум, три, а то и больше аллокаций. Этот момент катастрофически замедлит твой код.std::string
тут тебе не нужен, т.к. typeid(T).name()
возвращает статически определенную строку, адрес которой будет одинаковым.type_info
умеет возвращать хэш этой строки. Хэш будет тоже предрассчитанный. В результате тебе и map<string, unsigned int>
тоже не больно нужен. Лучше ключ в карте заменить со строки на хэш. А при использовании std::unordered_map
этот хэш будет использовать как есть и лишних вычислений не будет.auto it = memoryMonitor.AllocatedTypes.find(typeName);
if (it == memoryMonitor.AllocatedTypes.end())
{
memoryMonitor.AllocatedTypes.emplace(typeName, 1);
}
else
{
it->second++;
}
memoryMonitor.AllocatedTypes[ typeName ]++;
void MakeReport()
можно ли сделать шаблонные функции членами класса - не знаю
конструктор копирования должен вызываться при копирующей инициализации
fillArray
. :)a
прямо из main
, после чего код fillArray
выполняет ряд описанных в нем присвоений.return
в fillArray
становится фиктивен, а локальная переменная выпадает из кода за ненадобностью.struct Pointer;
- это предварительное объявление структуры в пространстве имен типа Holder
.friend struct Pointer;
- тут нужно проявить внимательность.The name of the class that is used in this friend declaration does not need to be previously declared.
When a local class declares an unqualified function or class as a friend, only functions and classes in the innermost non-class scope are looked up, not the global functions
Pointer
будет произведено в том пространстве имен, где определен тип Holder
, а не в его пространстве имен.Holder::Pointer
, требуется сперва сделать предварительное объявление структуры Pointer
в пространстве Holder
.friend Pointer;
чтобы использовать уже объявленное имя вместо создания предварительного объявления этого имени.struct
в строке friend struct Pointer;
. Да и то только если ты пользуешься C++11.Структура, объявленная как вложенная, не получает автоматического доступа
к закрытым членам внешней структуры.
Like any member of its enclosing class, the nested class has access to all names (private, protected, etc) to which the enclosing class has access ...
Pointer
, так и объявление его дружественности. С поправкой, конечно, на C++11.