Intereting Posts
Могут ли входные и выходные строки для sprintf () быть одинаковыми? Функция C, определенная как int, но не имеющая оператора return в теле, все еще компилируется Кастинг int указатель на указатель char вызывает потерю данных в C? Ошибка в make-файле («нет входных файлов») Вывод препроцессора cpp не способен понять? Оптимизированная версия strstr (поиск имеет постоянную длину) Самый низкий общий предок двоичного дерева (не двоичное дерево поиска) Как инициализировать 3D непрерывный массив в C Сбивание значений при копировании в другой массив ansi c struct {с динамическим массивом}, назначенный массиву, который является realloc Как напечатать знак процента (%) в c Данные, записанные в файл с использованием glib C Язык: Почему malloc () возвращает указатель, а не значение? Почему sem_open работает с fork () без разделяемой памяти? Невозможно понять различные результаты экспериментов с размерами буфера в C и C ++. Также ifstream медленнее, чем FILE?

Недостатки вызова realloc в цикле

Я пытаюсь реализовать некоторые математические алгоритмы в C на Windows 7, и мне нужно многократно увеличивать размер моего массива.

Иногда это терпит неудачу, потому что realloc не может выделить память. Но если я выделяю много памяти сразу в начале, он отлично работает.

Это проблема с менеджером памяти? Может ли кто-нибудь объяснить мне это, пожалуйста?

  1. Когда вы выделяете / освобождаете память много раз, она может создавать fragmentацию в памяти, и вы не можете получить большой непрерывный fragment памяти.
  2. Когда вы выполняете realloc, для переноса данных может потребоваться некоторая дополнительная память в течение короткого периода времени.

Если ваш алгоритм не нуждается в непрерывной памяти или может быть изменен для работы с несмежной памятью, подумайте об использовании связанных списков массива (Something link std :: dequeue of C ++), который позволит избежать копирования данных, и ваш код может не пострадать от OOM , Если вы знаете наихудшее требование к памяти для массива, лучше сохранить эту память из самого начала, так как это позволит избежать затрат на распределение и перемещение данных по сравнению с realloc .

Я хочу, чтобы ваши алгоритмы работали быстро, постарайтесь сделать все распределение памяти впереди. Распределение памяти – неограниченная операция и убьет вашу производительность. Так что предположите разумный худший случай и выделите достаточно для этого. Если вам нужно переделать позже, но не делайте этого постоянно.