将std::stringstream转换为const char**而不进行内存分配

5
据我所知,std::stringstream 内部的表示不是一个 std::string,而是一组 std::string 实例(如果我错了,请纠正我)。
我有一个作为 std::stringstream 表示的数据,并且我想将其传递给一个 C 函数 (OpenCLclCreateProgramWithSource),该函数将其作为字符数组的数组接收 (const char**)。
是否有一种方法可以实现这一点,而不必先创建一个包含 stringstream 整个内容的字符串,例如以下方式:
std::string tmp1 = my_stringstream.str();
const char* tmp2 = tmp1.c_str();
const char** tmp3 = &tmp2;

编辑

跟进问题:

如果不可能的话,是否有一些替代方法可以继承自std :: ostream 并允许这种低级别的访问,而不是使用std::stringstream


1
stringstream 的实现未指定。对于 C++,内部的 streambuf 对象是一个有用的低级访问点,但对于 C 互操作性,您的代码基本上已经足够好了。 - Kerrek SB
2
如果串联和拆分流实际上成为瓶颈,您可以从ostreamstreambuf派生出自己的流来实现回退。 (https://dev59.com/tljUa4cB1Zd3GeqPTac6) - Lol4t0
5
你试图在完全错误的层面上进行优化。与 clCreateProgramWithSource 相比,复制一个字符串的成本可以说是 微不足道 的。这就像从一只大象身上拔掉一只苍蝇,希望它会减轻体重一样。 - Bo Persson
1
@BoPersson 我百分之百确定你是对的,clCreateProgramWithSource中的开销确实存在。事实上,我已经测试过直接构建LLVM中间代码而不是使用Clang进行代码生成和编译,只发现性能几乎没有任何差异。而我的OpenCL实现使用的是Clang/LLVM afaik。但我仍然对C++/C互操作中的std::stringstreamchar**转换感兴趣。 - Joel
2
我不确定它是否正确,但我做了这个:stream.str().c_str() - Tomáš Zato
显示剩余2条评论
1个回答

1
通过获取stringstream的streambuf,我们可以显式地设置它应该使用的缓冲区:
#include <sstream>

constexpr size_t buffer_size = 512;

void dummy_clCreateProgramWithSource(const char **strings) {}

int main () {
  char * ss_buffer = new char[buffer_size];
  std::stringstream filestr; // TODO initialize from file
  filestr.rdbuf()->pubsetbuf(ss_buffer,buffer_size);
  const char** extra_indirection = const_cast<const char **>(&ss_buffer);
  dummy_clCreateProgramWithSource(extra_indirection);
  return 0;
}

注意const_cast,它可能是一个谎言;我们向OpenCL承诺,在调用clCreateProgramWithSource之后,我们不会向stringstream写入内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接