При оптимизации умножения процедуры для многопоточность, в качестве окончательной проверки точности я вычислил π до 10 000 000 цифр, потому что я могу скачать это с любого количества онлайн-сайтов для сравнения. Для этого требуется мантисса из 519 052 uint64_t (32 219 328 бит точности), и, к моему удивлению, программа быстро выдала исключение нехватки памяти.
Мой компьютер оснащен процессором AMD с 8 физическими ядрами и 16 логическими, а также 64 ГБ памяти. Я повторил попытку, отслеживая память с помощью диспетчера задач Windows 11, и все 64 ГБ были быстро израсходованы. Моей первой мыслью была неприятная утечка памяти, но через пару часов я убедился, что это не так. Виновниками были два необработанных указателя в многократно вызываемой подпрограмме, распределяющей массивы в куче следующим образом:
Код: Выделить всё
...
uint64_t* aPtr = new uint64_t[aSize];
...
Я использую Visual Studio 2022. Неужели компилятор плохо справляется с управлением распределением памяти с помощью необработанных указателей, но лучше справляется с интеллектуальными указателями? Мне было бы очень интересно услышать мнение тех из вас, кто знает больше о внутренней работе компиляторов, о которой я знаю лишь немного. Или это что-то фундаментальное для необработанных указателей по сравнению с интеллектуальными указателями?
Кстати: я просмотрел весь свой код на C и C++ и полностью принял умные указатели.
Подробнее здесь: https://stackoverflow.com/questions/797 ... n-the-heap
Мобильная версия