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に渡しbufますTHIRD_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 スタイルの null で終了する char[ ]。

于 2012-12-29T13:27:09.817 に答える