SQLITE_STATIC vs SQLITE_TRANSIENT的c++字符串

sqlite3_bind_text SQLITE_STATIC vs SQLITE_TRANSIENT for c++ string

本文关键字:SQLITE c++ 字符串 vs STATIC TRANSIENT      更新时间:2023-10-16

我有一个返回c++ std::string的方法,然后在将其传递给sqlite3_bind_text之前将其转换为c_str()。我的问题是,应该使用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(), and的第五个参数sqlite3_bind_text16()是一个析构函数,用于处理BLOB或字符串在SQLite完成后。析构函数被调用为处理BLOB或字符串,即使调用sqlite3_bind_blob(),Sqlite3_bind_text()或sqlite3_bind_text16()失败。如果是第五参数是特殊值SQLITE_STATIC,那么SQLite假定这些信息位于静态的、未管理的空间中,并且不需要这样做释放。如果第五个参数的值为SQLITE_TRANSIENT,则对象之前,SQLite立即创建自己的私有数据副本Sqlite3_bind_ *()例程返回

GetIpString返回一个std::string,但是如果我不显式地复制它,该字符串在调用后会继续存在吗?另外,在没有sqlite_transient的情况下使用.c_str()是否安全?我知道SQLITE_TRANSIENT是安全的选择,但是我想避免在不需要的情况下对复制/性能造成影响,因为这个查询将会运行很多次。

在您的示例中,GetIpString()返回的字符串对象很可能在查询执行和结束之前被破坏,因此您应该SQLITE_TRANSIENT

一般来说,您不应该为临时副本而烦恼,除非您已经测量到它会导致实际的性能问题。