Являются ли необработанные указатели расходом памяти при размещении в куче? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Являются ли необработанные указатели расходом памяти при размещении в куче? [закрыто]

Сообщение Anonymous »

У меня есть библиотека C++20 с высокоточными операциями с плавающей запятой, которые я использую для научных вычислений. Числа FP имитируют стандарт IEEE 754, но вместо 53-битной мантиссы и 11-битной степени 2, которые можно получить с помощью double, я использую массив uint64_t[] в качестве мантиссы BigInt и 32-битное целое число со знаком в качестве показателя степени 2.
При оптимизации умножения процедуры для многопоточность, в качестве окончательной проверки точности я вычислил π до 10 000 000 цифр, потому что я могу скачать это с любого количества онлайн-сайтов для сравнения. Для этого требуется мантисса из 519 052 uint64_t (32 219 328 бит точности), и, к моему удивлению, программа быстро выдала исключение нехватки памяти.
Мой компьютер оснащен процессором AMD с 8 физическими ядрами и 16 логическими, а также 64 ГБ памяти. Я повторил попытку, отслеживая память с помощью диспетчера задач Windows 11, и все 64 ГБ были быстро израсходованы. Моей первой мыслью была неприятная утечка памяти, но через пару часов я убедился, что это не так. Виновниками были два необработанных указателя в многократно вызываемой подпрограмме, распределяющей массивы в куче следующим образом:

Код: Выделить всё

...
uint64_t* aPtr = new uint64_t[aSize];
...
с aSize = 519,052 и освобождается в той же подпрограмме с помощью соответствующих операторов delete[]. Из любопытства я заменил эти два необработанных указателя умными указателями, и программа заработала хорошо, хотя это и заняло пару часов. И ни разу он не занимал более нескольких сотен МБ.
Я использую Visual Studio 2022. Неужели компилятор плохо справляется с управлением распределением памяти с помощью необработанных указателей, но лучше справляется с интеллектуальными указателями? Мне было бы очень интересно услышать мнение тех из вас, кто знает больше о внутренней работе компиляторов, о которой я знаю лишь немного. Или это что-то фундаментальное для необработанных указателей по сравнению с интеллектуальными указателями?
Кстати: я просмотрел весь свой код на C и C++ и полностью принял умные указатели.

Подробнее здесь: https://stackoverflow.com/questions/797 ... n-the-heap
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»