【发布时间】:2011-07-19 06:28:41
【问题描述】:
我有一个固定长度的字符缓冲区,我想将它提供给一个接受 std::istream& 的函数。在不复制缓冲区的情况下如何做到这一点?
如果这意味着派生自定义流缓冲区,我想我会接受副本。我只是想知道我是否遗漏了一些简单的东西。
这是我现在正在做的事情(不需要的副本):
void loadFromBuffer(const char* buff, size_t len) {
std::istringstream is(std::string(buff, len)); // BUFFER COPIED HERE :(
load(is);
}
编辑:
为了记录,这是使用boost.Iostreams 的简单解决方案:
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>
void loadFromBuffer2(char* buff, size_t len) {
typedef boost::iostreams::stream<boost::iostreams::array_source> array_stream;
array_stream is(buff, len);
load(is);
}
我接受了 Boost.Iostreams 的答案,因为它似乎是“正确”的解决方案,但是它不能在我的平台(Android NDK)上编译,所以我最终使用了已弃用的 std::istrstream 解决方案。谢谢大家。
【问题讨论】:
-
您是否检查过在这种情况下副本没有被优化掉?
-
仅供参考,
std::istrstream提供此功能。它有构造函数(char*, streamsize)。但是,您可能知道,此类已被弃用...