加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中的缓冲区大小

发布时间:2020-12-16 05:07:22 所属栏目:百科 来源:网络整理
导读:我正在使用C Std库方法std :: ostream :: write()观察以下行为. 为了缓冲数据,我正在使用以下C API std::ofstream::rdbuf()-pubsetbuf(char* s,streamsize n) 只要我们在文件流上写入数据(datasize)的大小,这样就可以正常工作(使用strace实用程序验证) std::
我正在使用C Std库方法std :: ostream :: write()观察以下行为.

为了缓冲数据,我正在使用以下C API

std::ofstream::rdbuf()->pubsetbuf(char* s,streamsize n)

只要我们在文件流上写入数据(datasize)的大小,这样就可以正常工作(使用strace实用程序验证)

std::ofstream::write (const char* s,datasize n)

小于1023字节(低于此值,写入累积直到缓冲区未满),但是当要写入的数据大小超过1023时,不考虑缓冲区并将数据刷新到文件中.

例如如果我将缓冲区大小设置为10KB并且每次写入大约512字节,则strace将显示多个写入已合并为单个写入

writev(3,[{"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"...,9728},{"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"...,512}],2) = 10240 ( 10 KB )
writev(3,2) = 10240
...

但是当我一次写入1024个字节(保持缓冲区固定为10 KB)时,现在strace告诉我它没有使用缓冲区,并且每个ofstream :: write调用都被转换为写入系统调用.

writev(3,[{NULL,0},1024}],2) = 1024 ( 1KB )
writev(3,2) = 1024
...

是否有我缺少的C API调用或Linux调优参数?

解决方法

这是libstdc的实现细节,在bits / fstream.tcc的第650行附近实现.基本上,如果写入大于2 ^ 10,它将跳过缓冲区.

如果您想要这个决定背后的基本原理,我建议您发送邮件到libstdc开发列表.

http://gcc.gnu.org/ml/libstdc++/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读