我有一个返回 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() 和 sqlite3_bind_text() 的第五个参数
sqlite3_bind_text16() 是一个析构函数,用于处理 BLOB 或
SQLite 完成处理后的字符串。析构函数被调用
即使调用 sqlite3_bind_blob(),也会处理 BLOB 或字符串,
sqlite3_bind_text() 或 sqlite3_bind_text16() 失败。如果第五个
参数是特殊值 SQLITE_STATIC,那么 SQLite 假设
该信息位于静态、非托管空间中,不需要
释放了。如果第五个参数的值为 SQLITE_TRANSIENT,则
SQLite 在执行之前立即创建自己的数据私有副本
sqlite3_bind_*() 例程返回。
GetIpString 返回一个 std::string,但是如果我没有显式复制它,该字符串在调用后会继续存在吗?另外,一般来说,在没有 SQLITE_TRANSIANT 的情况下使用 .c_str() 是否安全?我知道 SQLITE_TRANSIENT 将是安全的选择,但如果不需要,我想避免复制/性能受到影响,因为这个查询将运行很多次。
在您的情况下,返回的字符串对象GetIpString()
很可能在查询执行和最终确定之前被破坏,所以你应该SQLITE_TRANSIENT
.
一般来说,您不应该担心临时副本,除非您已经测量到由此导致的实际性能问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)