当前位置:  开发笔记 > 运维 > 正文

将指针传递给保证归零的内存

如何解决《将指针传递给保证归零的内存》经验,为你挑选了1个好方法。

我需要将文件中不同大小的记录归零.为此,我正在分配虚拟记录,将memset它们归零,并将它们传递给写入函数.

是否有一些区域可以保证始终为零(并且大小足够大),我可以反而指出,不需要重复分配和清零内存?



1> Gilles 'SO- ..:

如果记录大小有合理的上限,则分配一个包含零的全局只读变量.(因为它是一个静态持续时间对象,它会自动初始化为零.)

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零填充缓冲区.


如果您明确初始化它,大多数编译器会将对象写入二进制文件.这不仅仅是愚蠢的,而是保持与系统级代码中使用的一些传统技巧的兼容性,其中作者具有特定于实现的理由,希望该对象在`.data`或`.bss`中.
推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有