5

C++ std::string を返すメソッドがあり、それを c_str() に変換してから sqlite3_bind_text に渡します。私の質問は、これは SQLITE_STATIC または SQLITE_TRANSIENT を使用する必要がありますか?

sqlite3_bind_text(insertStatement, 0, suspect->GetIpString().c_str(), -1, SQLITE_STATIC);
// Do some stuff in same function then sqlite3_step

sqlite3_bind_text のドキュメントには、

sqlite3_bind_blob()、sqlite3_bind_text()、および sqlite3_bind_text16() の 5 番目の引数は、SQLite が処理を終了した後に BLOB または文字列を破棄するために使用されるデストラクタです。sqlite3_bind_blob()、sqlite3_bind_text()、または sqlite3_bind_text16() の呼び出しが失敗した場合でも、BLOB または文字列を破棄するためにデストラクタが呼び出されます。5 番目の引数が特別な値 SQLITE_STATIC である場合、SQLite は情報が静的で管理されていない領域にあり、解放する必要がないと想定します。5 番目の引数の値が SQLITE_TRANSIENT の場合、SQLite は、sqlite3_bind_*() ルーチンが戻る前に、すぐにデータの独自のプライベート コピーを作成します。

GetIpString は std::string を返しますが、明示的にコピーを作成しない場合、その文字列は呼び出し後も存在し続けますか? また、一般的に SQLITE_TRANSIANT なしで .c_str() を使用しても安全ですか? SQLITE_TRANSIENT が安全な選択であることはわかっていますが、このクエリは頻繁に実行されるため、必要がない場合はコピー/パフォーマンスへの影響を避けたいと考えています。

4

1 に答える 1

10

あなたの場合、によって返される文字列オブジェクトはGetIpString()、クエリが実行されてファイナライズされる前に破壊される可能性が高いため、SQLITE_TRANSIENT.

一般に、これが原因であると測定された実際のパフォーマンスの問題がない限り、一時コピーについて気にする必要はありません。

于 2013-04-16T18:26:48.197 に答える