Если есть разумная верхняя граница для размера записи, выделите глобальную переменную только для чтения, содержащую нули.(Поскольку это объект статической длительности, он автоматически инициализируется нулем.)
const unsigned char zero_filled_buffer[MAX_RECORD_SIZE]; /*at file scope*/
Если функция записи представляет собой C fwrite
или POSIX write
или другую функцию, вы можете (должны, дляwrite
) вызывайте его в цикле, чтобы буфер не должен был быть таким же большим, как самая большая запись, настолько же большим, как самый большой кусок, который вы пишете за один раз.
Такая переменная будет принимать нольпространство в вашем исполняемом файле под типичными размещенными реализациями. ДОБАВЛЕНО : обратите внимание, что в отношении стандарта C приведенное выше объявление в точности эквивалентно const unsigned char zero_filled_buffer[MAX_RECORD_SIZE] = {0};
, однако некоторые компиляторы (включая gcc) включают нули в исполняемый файл, если вы явно добавили = {0}
, нонет, если вы не включите инициализатор.
Интеллектуальный загрузчик программ в системе с виртуальной памятью может использовать систему виртуальной памяти для использования единой совместно используемой доступной только для чтения страницы физической памяти ОЗУ для всех такихобъекты;Я не знаю, делают ли это на практике. ДОБАВЛЕНО : Например, Linux (Debian lenny amd64) этого не делает.
Альтернативный подход POSIX - mmap
файл и вызов memset
для буферов с нулевым заполнением.