Лучший способ - просто записать заголовок в новый файл, а затем добавить содержимое старого.
C ++ не предоставляет способ вставки в начале существующего файла, так что это действительно лучшая ставка.Просто убедитесь, что вы прочитали достаточно большие куски из старого файла и добавили их в новый.Несмотря на то, что буферизация облегчит большинство проблем, связанных с выполнением этой операции небольшими порциями, вы все равно будете испытывать снижение производительности при большем количестве вызовов функций.
Это может быть минимальным, но оно все еще есть.Что касается файла 2G, я бы, вероятно, начал с того, что делал бы его по половине гигабайта, если только память не была слишком дорогой.Это позволяет использовать файлы большего размера без значительных потерь памяти, и четыре вызова для чтения / записи вряд ли станут проблемой производительности.
Но, как и во всех оптимизациях, измерьте, не догадайтесь.Существуют различные вещи низкого уровня, которые могут повлиять на производительность, о которых документ стандартов C ++ не упоминает (и это правильно).Поскольку в вашем вопросе не упоминается конкретная операционная система, я ответил на основании этого, но эти конкретные операционные системы могут обе (а) реагировать по-разному;и (b) предоставлять другие нестандартные вызовы, которые можно сделать быстрее.