最近研究了下如何用qt的原生控件来加载和显示大文件(>1G),分享下一些摸索经验。
下文源码:
compilelife/loginsightgithub.com![6d510d1d74eaeba429a484da660fbedb.png](https://i-blog.csdnimg.cn/blog_migrate/a4e19003d39386d9e869080bb47d55ae.jpeg)
文件的内存映射
在开始qt部分之前,我们先了解一个概念——文件的内存映射。
我们知道一般读文件用到的API是fopen/fread/fclose
,或者是open/read/close
,这种方式都需要内核帮忙作一次拷贝。
linux中有一个函数叫mmap
(windows也有类似功能),可以避免这样的一次拷贝。
请看这幅对比图(图片来源:https://www.jianshu.com/p/eece39beee20):
![4f0e2c4cf36870074319d9f4c117eedb.png](https://i-blog.csdnimg.cn/blog_migrate/bee0903b6f94d080c810e2eb1c2949c3.jpeg)
当我们用fread/read
时,都是触发了一个步骤1的read
系统调用,然后内核帮忙到磁盘中把请求的文件内容读取到kernnel bufferÿ