为什么 fprintf 在分配的字节上使用 valgrind 上的这么多内存?
Why does fprintf uses so much memory on valgrind on bytes allocated?
我想了解为什么我的 valgrind 报告我在文件上执行简单的 fprintf 时使用了 8.664 字节:
#include <stdio.h>
int main(){
FILE* creation = fopen("test.txt", "w+");
fprintf(creation, "something");
fclose(creation);
}
valgrind 报告:
==3947== HEAP SUMMARY:
==3947== in use at exit: 0 bytes in 0 blocks
==3947== total heap usage: 2 allocs, 2 frees, 8,664 bytes allocated
为什么会这样?
这是您系统上 glibc 的实现细节。
因为它会释放它分配的所有内容,所以您无需担心。
您的 C 库似乎延迟分配与 FILE 对象关联的输出缓冲区,直到实际写入 FILE 时,或者直到您使用 setvbuf
配置缓冲。我在评论中建议的 setvbuf 调用 disables 缓冲,在这种情况下,第二次分配根本不会发生。
8664 - 472 = 8192 或 8 KB 是 FILE 输出缓冲区的合理默认大小。 (为了获得最大 I/O 效率,它需要是 4096 的倍数,这是典型的 VM 页面和磁盘块大小。)如果需要,您可以通过对 setvbuf 的其他调用来调整大小;有关详细信息,请参阅其文档。
我想了解为什么我的 valgrind 报告我在文件上执行简单的 fprintf 时使用了 8.664 字节:
#include <stdio.h>
int main(){
FILE* creation = fopen("test.txt", "w+");
fprintf(creation, "something");
fclose(creation);
}
valgrind 报告:
==3947== HEAP SUMMARY:
==3947== in use at exit: 0 bytes in 0 blocks
==3947== total heap usage: 2 allocs, 2 frees, 8,664 bytes allocated
为什么会这样?
这是您系统上 glibc 的实现细节。
因为它会释放它分配的所有内容,所以您无需担心。
您的 C 库似乎延迟分配与 FILE 对象关联的输出缓冲区,直到实际写入 FILE 时,或者直到您使用 setvbuf
配置缓冲。我在评论中建议的 setvbuf 调用 disables 缓冲,在这种情况下,第二次分配根本不会发生。
8664 - 472 = 8192 或 8 KB 是 FILE 输出缓冲区的合理默认大小。 (为了获得最大 I/O 效率,它需要是 4096 的倍数,这是典型的 VM 页面和磁盘块大小。)如果需要,您可以通过对 setvbuf 的其他调用来调整大小;有关详细信息,请参阅其文档。