0

我知道一种从流中读取并使用它的方法,如下所示:

strstream s; // It can be another standard stream type
// ...
while (!s.eof())
{
  char buf[MAX];
  s.read(buf, sizeof (buf));
  int count = s.gcount();

  THIRD_PARTY_FUNCTION(buf, count);
  // ...
}

但是这段代码有一个滥用点,它首先将数据从流复制到buf,然后传递bufTHIRD_PARTY_FUNCTION

有什么方法可以将代码改写为如下所示(我的意思是下面的代码避免了额外的副本)?

strstream s; // It can be another standard stream type
// ...
while (!s.eof())
{

  char *buf = A_POINTER_TO_DATA_OF_STREAM(s);
  int count = AVAIABLE_DATA_SIZE_OF_STREAM(s);
  // Maybe it needs s.seekg(...) here

  THIRD_PARTY_FUNCTION(buf, count);
  // ...
}
4

2 回答 2

1

像这样的东西可能对你有用。

char           buffer[2000];
std::istream&  s = getStreamReference();
s.rdbuf()->pubsetbuf(buffer, 2000);

while(s)
{
    THIRD_PARTY_FUNCTION(buffer, s.rdbuf()->in_avail());
    s.ignore(s.rdbuf()->in_avail());

    // Not sure this may go into an infinite loop.
    // Its late here so I have not tested it.
}

请注意,我关心复制 2K 缓冲区的成本。
在我考虑进行这种优化之前,分析必须表明这是一个导致性能显着下降的真正热点。在 99% 的时间里,可读性将是我最重要的因素。

于 2012-12-29T13:29:38.440 回答
0

您可以将 std::stringstream 转换为 c 风格的字符串,方法是首先调用其成员方法str以获取 std::string,然后调用其成员函数c_str将其转换为 c 风格的空终止字符 [ ]。

于 2012-12-29T13:27:09.817 回答