nan? printf("%c ", str[1][0]); показывает тебе все правильно.str[1][0]? 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()можно ли сделать шаблонные функции членами класса - не знаю
Ты не можешь просто взять и утверждать что раз
0.1представляется каким-то одним образом, то и результат сложения числа десять раз должен быть больше1.0.Результат твоих 9 сложений будет где-то близко к
1.0в пределах отклонения, не дальше чем наstd::numeric_limits<double>::epsilon()[?]. Именно так и обеспечивается точность операций по IEEE-754.Т.е. результат может оказаться незначительно больше
1.0, а может оказаться незначительно меньше.И именно это демонстрируется в твоем вопросе, т.к. эпсилон для типа
doubleнаходится за 15м знаком после запятой.