【发布时间】:2012-03-26 08:44:31
【问题描述】:
我正在两个框架(OpenSceneGraph 和 wxWidgets)之间进行内存中的图像转换。不想关心底层类(osg::Image 和 wxImage),我使用两个 API 提供的面向流的 I/O 功能,如下所示:
1) 创建std::stringstream
2) 使用 OSG 的 writer 写入流
3) 使用 wxWigdets 阅读器从流中读取
这很好用。到目前为止,我一直在使用对流缓冲区的直接访问,但最近我的注意力被std::stringstream 的“非连续底层缓冲区”问题所吸引。我一直在使用 kludge 将 const char* ptr 放入缓冲区 - 但它有效(在 Windows、Linux 和 OSX 上测试,使用 MSVC 9 和 GCC 4.x),所以我从未修复它。
现在我明白这段代码是一个定时炸弹,我想摆脱它。这个问题已经在 SO (here for instance) 上多次提出,但我找不到真正能帮助我做最简单的事情的答案。
我认为最合理的做法是在幕后使用向量创建我自己的 streambuf - 这将保证缓冲区是连续的。我知道这不是一个通用的解决方案,但考虑到我的限制:
1) 所需的大小不是无限的,实际上是可以预测的
2) 由于 API,我的流确实需要是 std::iostream(我不能使用原始字符数组)
任何人都知道我如何使用 chars 向量来自定义 stringbuf 吗?请不要回答“使用std::stringstream::str()”,因为我知道我们可以,但我正在寻找其他东西(即使你会说复制 2-3 MB 如此之快以至于我什至不会注意到差异,让我们考虑一下,我仍然对自定义 stringbuf 感兴趣,只是为了练习的美感)。
【问题讨论】: