【发布时间】:2015-07-03 21:40:44
【问题描述】:
在阅读freadhere 的文档时,它解释了void *ptr 之后的两个参数相乘以确定文件中读取/写入的字节数。以下是链接中给出的fread 的函数头:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
我的问题是,除了函数的返回值之外,调用它们之间是否真的存在行为或性能差异:
// assume arr is an int[SOME_LARGE_NUMBER] and fp is a FILE*
fread(arr, sizeof(arr), 1, fp);
fread(arr, sizeof(arr) / sizeof(int), sizeof(int), fp);
fread(arr, sizeof(int), sizeof(arr) / sizeof(int), fp);
fread(arr, 1, sizeof(arr), fp);
哪一个通常是最佳实践?或者一个更普遍的问题是,我如何决定在任何给定场景中为每个参数指定什么?
编辑
为了澄清,我不是要求证明两个论点而不是一个论点,我要求的是一种通用方法来决定在任何给定情况下传递给论点的内容。而马西米利亚诺在 cmets 中链接并引用的 this answer 仅提供了两个具体示例,并没有充分解释为什么会发生这种行为。
【问题讨论】:
-
行为是不同的,但是由于您不检查错误,因此您看不到它。 性能 依赖于使用的特定库。在标记为重复项中指出“fread 在内部通过
fputc工作”,这最初可能是正确的,但在 21 世纪很难相信。 -
然后看看链接中的第二个答案;)
-
@Massimiliano 仅指定了两种特殊情况,正如评论者指出的那样,该答案可能需要很多改进。
-
在这种情况下,我会尝试改进现有答案,而不是复制它。不过,只是我的 2 美分。