Так вот, этот код работает, но нормально он работает у меня только на GNU/Linux amd64. На Windows собирал через MInGW и Visual C++ 2008 и получал, что маленькие файлы он загрузит, а большие ОЧЕНЬ-ОЧЕНЬ-ОЧЕНЬ долго грузит.
Можно ли это как-нибудь облагородить?
если это делается в цикле, то это может быть очень долгим, потому что периодически realloc() нужно перемещать кусок памяти в другое место. если нужно что-то часто добавлять в массив, я заранее резервирую место элементов на 10-15 и "реаалочу" только в случае, когда выделенное место закончилось и надо выделить еще.
Да, если такая операция выполняется часто. то лучше резервировать мето заранее. Правильнее даже будет резервировать не на 10-15 элементов, а, к примеру в 2 раза. Если жалко - в 1.5 возьмите :) Ну, в таком духе: зарезервировали сразу 16 байт. Если кончилось - добавили ещё 16 (в сумме 32). Закончились - ещё 32 выделили, затем 64 и т.д.
Если читается именно файл (НЕ поток!), то можно сначала узнать его размер (например ftell+fgetpos), а потом выделить нужное количество памяти. Можно и с потоком такое проделать конечно, только надо проверять ошибки - например у /dev/zero нет конца, в этом случае можно выделять память начиная с малого числа (например 100), а потом удваивать размер при необходимости, как писал NickLion