我需要将文件中不同大小的记录归零.为此,我正在分配虚拟记录,将memset
它们归零,并将它们传递给写入函数.
是否有一些区域可以保证始终为零(并且大小足够大),我可以反而指出,不需要重复分配和清零内存?
如果记录大小有合理的上限,则分配一个包含零的全局只读变量.(因为它是一个静态持续时间对象,它会自动初始化为零.)
const unsigned char zero_filled_buffer[MAX_RECORD_SIZE]; /*at file scope*/
如果写函数是C fwrite
或POSIX write
或其他函数,你可以(必须,for write
)在一个循环中调用它,所以缓冲区不必像最大的记录那么大,就像你最大的块一样大马上写.
在典型的托管实现下,这样的变量将在可执行文件中占用零空间.补充:请注意,就C标准而言,上面的声明完全等同于const unsigned char zero_filled_buffer[MAX_RECORD_SIZE] = {0};
某些编译器(包括gcc)在可执行文件中包含零,如果您明确添加= {0}
但不是如果您不使用初始化程序.
具有虚拟内存的系统上的智能程序加载器可以利用虚拟内存系统为所有这些对象使用物理RAM的单个共享只读零填充页面; 我不知道在实践中是否有任何做法.补充:例如,Linux(Debian lenny amd64)没有.
另一种POSIX方法是mmap
文件并调用memset
零填充缓冲区.