В качестве первого вопроса представьте malloc
как вызов памяти для хранения ряда N объектов, каждый из которых имеет размер S. Когда у вас есть параметры void ** arrayToFill, int arrayLength
, вы говорите, что этот массив будет содержать arrayLength
количество указателей размера sizeof(void*)
.Это первое выделение и вызов malloc.
Но члены этого массива являются указателями, которые предназначены для хранения массивов или, по сути, памяти какого-либо другого объекта.При первом вызове malloc выделяется только память для хранения void*
каждого элемента массива, но для памяти каждого отдельного члена массива требуется собственный вызов malloc()
.
Эффективное чтение строки
Что касается другого вопроса, выполнение большого количества небольших выделений памяти, а затем освобождение их (при условии, что вы сделаете это, в противном случае вы потеряете много памяти), выполняется очень медленно.Однако снижение производительности для задач, связанных с вводом / выводом, в большей степени зависит от количества вызовов, чем для количества выделяемой памяти.
Ваша программа прочитает весь файлв память, и выделите массив unsigned long long
для 20 миллионов, или столько целых чисел, которые вы ожидаете обработать.Таким образом, вы можете анализировать содержимое файла, использовать функцию strtol
из <stdlib.h>
и по очереди копировать результирующий long в ваш большой массив.
Таким образом, вы используете только 2-3большие выделения памяти и освобождения.