问题标签 [filebuf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
50 浏览

c++ - 传递给 std::ifstream 的 std::filebuf 并不总是被调用

目标

为旧版C++11 程序提供无缓冲 I/O禁用内核页面缓存。此功能必须按需提供(通过可执行参数)。这个想法是为了减少 I/O 操作的内存开销,而不管性能如何。我不确定这是实现这一目标的正确方法......

我的尝试

代码库非常大,大量使用std::ifstreamstd::ofstream分布在不同的二进制文件/库中,我的目标是实现一个派生自std::filebuf依赖 CI/O 特性的类(FILE *因此open()我可以传递O_DIRECT标志等),并通过使用继承的方法将它传递给一个std::ifstream对象(目前仅输入)std::basic_streambuf<CharT,Traits>* std::basic_ios<CharT,Traits>::rdbuf(std::basic_streambuf<CharT,Traits>*)

问题

问题是该std::ifstream对象实际上似乎有两个内部缓冲区。查看代码以了解我的实验(可能仍然存在一些明显的错误)。

我的文件缓冲区

客户端代码

输出

如输出所示,两种风格的rdbuf()不引用相同的内部缓冲区,并且FileBuf::open在它应该是的时候永远不会被调用,如std::basic_ifstream<CharT,Traits>::open中指定的那样:

有效调用 rdbuf()->open(filename, mode | ios_base::in)

我明白发生了什么:std::basic_ifstream::rdbuf正在调用返回的内部缓冲区对象而不是 from std::basic_ios<CharT,Traits>::rdbuf,但是,我仍然不知道如何获得我想要的行为。

我想避免 - 不惜一切代价 -std::ifstream用它的自定义实现替换所有引用,因为这意味着替换所有当前声明中的类型。

注意:我正在使用gcclibstdc++进行编译。