2011-12-30 4 views
1

QIODevice::readLine()を使用しようとしています。私は、行を読んでエラーを検出し、QStringのようにそれを操作する必要がQIODevice :: readLine()を使用する正しい方法

char buffer[SIZE]; 
qint64 used; 
used = iodevice->readline(buffer, SIZE); 

:char *に

QByteArray buffer = iodevice->readLine() 

と1読み取りバッファを:QByteArrayを返す1 - 私は2つのバージョンを見てきました。

この2つのオーバーロードされたバージョンのうち、どれを単純で効率的なものにする必要がありますか?

  • QByteArrayのバージョンは、読み取りエラーを検出することができないとの問題を抱えている:私がこれまで知っている何

    。メモリは=オペレータの中で前後に割り当てられるかもしれません

  • char *バージョンでは読み込みエラーを検出できますが、読んだデータのサイズを制限してしまい、作業が難しくなります。

答えて

2

いい方法はありませんが、それは私が推測するアプリケーションに依存します。この操作のパフォーマンスがアプリケーションにとって重要である場合は、2つのプロファイルを単純に作成できます。

QByteArrayを使用すると、メモリを「前後に」割り当てていないと考えてください。 QByteArrayは暗黙的な共有を実装しているため、演算子=を使用するのが迅速かつ効率的です。 char *とまったく同じですが、もっと単純です。

QStringにはQByteArrayとchar *の両方が含まれているため、まったく同じです。

EDIT:QByteArrayが値によって返されたときのコピーのポイントを明確にするために、2つのオブジェクトが作成される可能性がありますが、浅いコピーのみが作成されます。したがって、効率的です。非常に重要なthisと読んでみてください。また、closer look :-)を持つことを検討してください

+0

答えをありがとう、それはパフォーマンスがそれほど重要ではないことを私に気づかせました:-) ちょっとした疑問:QByteArrayを返すと、関数内では割り付けが行われますreadLine (返される前に)2つのQByteArraysが作成されている必要があります(返されるものと、readLineが返された後に値を保持する関数スコープの外のもの) – cube

+0

答えにいくつかの詳細を追加しました。 –

関連する問題