问题标签 [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.
c++ - 传递给 std::ifstream 的 std::filebuf 并不总是被调用
目标
为旧版C++11 程序提供无缓冲 I/O和禁用内核页面缓存。此功能必须按需提供(通过可执行参数)。这个想法是为了减少 I/O 操作的内存开销,而不管性能如何。我不确定这是实现这一目标的正确方法......
我的尝试
代码库非常大,大量使用std::ifstream
并std::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
用它的自定义实现替换所有引用,因为这意味着替换所有当前声明中的类型。
注意:我正在使用gcc和libstdc++进行编译。