В какую сторону и на сколько будет погрешность, думаю, это можно посчитать, но для этого надо копнуть глубже.
epsilon*10
потому что каждая следующая операция выполняется на результате предыдущей, а ее результат округляется согласно правилам в IEEE-754 чтобы вписаться в допустимый набор бит.std::numeric_limits<T>::epsilon()
и означает допустимый предел отклонения результата от идеального. data
. Скорее всего адреса будут очень близко, в пределах памяти текстуры.width
и height
полученные из stbi_load
с данными файла изображения.channels
после выполнения stbi_load
и формат пикселя в файле изображения.0.1
представляется каким-то одним образом, то и результат сложения числа десять раз должен быть больше 1.0
.1.0
в пределах отклонения, не дальше чем на std::numeric_limits<double>::epsilon()
[?]. Именно так и обеспечивается точность операций по IEEE-754.1.0
, а может оказаться незначительно меньше.double
находится за 15м знаком после запятой. 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()