2

我正在尝试使用 ifstream 和 Procmon 分析基本读取操作。

用于读取操作的部分代码,我试图从文件中读取 16kb 大小的数据:

char * buffer = new char[128000];
ifstream fileHandle("file.txt");
fileHandle.read(buffer, 16000);
cout << buffer << endl;
fileHandle.close();

在 Procmon 中有 4 个 ReadFile 操作,详细信息如下:

偏移量:0,长度:4,096,优先级:正常
偏移量:4,096,长度:4,096
偏移量:8,192,长度:4,096
偏移量:12,288,长度:4,096

那么这是否意味着每个 4kb 大小有 4 个操作?如果是这样,为什么会发生这种情况,而不是只有一个 16 kb 大小的 ReadFile 操作。

4

2 回答 2

2

那么这是否意味着每个 4kb 大小有 4 个操作?

是的。

如果是这样,为什么会发生这种情况,而不是只有一个 16 kb 大小的 ReadFile 操作。

可能是因为编译器附带的标准库将文件流缓冲区的默认大小设置为 4 KB;由于read操作必须通过缓冲区,因此必须填充(通过操作系统调用)并清空 4 次才能满足您的请求。fstream请注意,您可以更改using的内部缓冲区fileHandle.rdbuf->pubsetbuf

于 2015-08-25T21:44:14.640 回答
1

那么这是否意味着每个 4kb 大小有 4 个操作?

这正是它所说的。

如果是这样,为什么会发生这种情况,而不是只有一个 16 kb 大小的 ReadFile 操作。

仅仅因为要求 16000 字节并不意味着ifstream可以在一次操作中实际读取 16000 字节。文件系统通常不允许如此大的读取,通常有一个上限。即使您增加ifstream使用 internaly 的内部缓冲区的大小,仍然不能保证文件系统将支持更大的读取大小。

的约定read()是它返回请求的字节数,除非遇到 EOF/错误。它如何实现内部读取是一个实现细节。在这种情况下,ifstream必须读取四个 4KB 块才能返回 16000 字节。

于 2015-08-25T21:43:52.323 回答