Qt中的QIODevice::Unbuffered
在QFile::open方法中有个参数是传OpenMode。
但是不是很理解这个QIODevice::Unbuffered是指什么方式。
他描述说的缓冲是指什么呢?
更新问题,谢谢pezy大大的解答。按照这个说法的话感觉大部分情况基本用不到这个Unbuffered方式了。
主要是最近遇到的一个问题比较恼火。
这个问题不是我问的,但是我遇到了和他一样的问题。报错了,我从报错信息来看应该是使用了未分配的内存。
而在这个地方的楼下,问题的主人找到了方法就是在open的时候选择Unbuffered这种方式即可避免,但是他也不清楚为什么会这样。
我发现这种方法有时可以解决问题,但是又好像不能,不清楚这个问题为什么发生,还望大大费心帮忙看一下
Answers
Unbuffered
就是无缓冲方式。
何谓缓冲?
科学释意
就是我们常说的
buffer
, 具体指针对 I/O 的缓存。它可以有很多更加具体的形式:
+-------------------+-------------------+
| Process A | Process B |
+-------------------+-------------------+
| C runtime library | C runtime library | C RTL buffers
+-------------------+-------------------+
| OS caches | Operating system buffers
+---------------------------------------+
| Disk controller hardware cache | Disk hardware buffers
+---------------------------------------+
| Disk |
+---------------------------------------+
如图所示,有 C/C++ 语言层面的、操作系统层面的,甚至硬盘层面的。其作用在于,创造一个中间层,从而避免频繁调用底层"昂贵"资源的调配权。
如你这里提到的写文件,你可能希望一个字节一个字节的往硬盘上写。但"写硬盘"存在 I/O 瓶颈,比起内存要慢许多。如果没有 buffer, 你每写一个字节的数据,就要去写一次硬盘,想象一下,会多么的慢。
而有了缓冲呢?你写入的字节通通都先放到一块 buffer 上(内存),由于是内存操作,所以速度非常快。等你写完、或者缓存的量到达某个限度,语言的 RTL 或 OS 才会将这一块数据,一次性写入硬盘中。
比较一下上述区别,体会一下缓冲的含义。这种策略,不仅常见于 I/O,上自浏览器的 cache, 下自 CPU 的高速缓存,其实都会用到。
形象比喻 (可能不雅)
譬如拉屎,你是拉一点就冲厕所呢?还是都拉完,才冲?
好吧,这是告诉你具体问题具体分析,你需不需要设置
Unbuffered
,要看你使用的时机。
最后一点注意:
Certain flags, such as
Unbuffered
and Truncate, are meaningless when used with some subclasses . Some of these restrictions are implied by the type of device that is represented by a subclass. In other cases, the restriction may be due to the implementation, or may be imposed by the underlying platform; for example, QTcpSocket does not supportUnbuffered
mode , and limitations in the native API preventQFile
from supporting Unbuffered on Windows .
即,
QTcpSocket
不支持
Unbuffered
,Windows 原生 API 也对该功能有限制。言下之意:尽量避免使用。