SQLITE_STATIC vs SQLITE_TRANSIENT的c++字符串
sqlite3_bind_text SQLITE_STATIC vs SQLITE_TRANSIENT for c++ string
我有一个返回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
。
一般来说,您不应该为临时副本而烦恼,除非您已经测量到它会导致实际的性能问题。
- 查询SQLite数据库中的日期
- 带内存和隔离功能的SQLite
- Qt SQLite没有查询或参数计数不匹配
- Qt SQlite无法创建表
- 数数并选择 sqlite 中的前三名
- 如何使用SQLite将数据库中的值导出为C / C++中的字符串或字符?
- 如何使用SQLite在qt中创建表?
- 使用 cl 构建代码并连接到 sqlite 库
- 连接到 URL Sqlite 数据库C++
- protobuf C++ SQLite handle blob data
- 损坏的结构字符数组 - sqlite C++
- 使用 SQlite 在 QT5 上关闭和打开数据库时出错
- 在SQLITE数据库中写入记录需要花费大量时间.如何提高刀片操作效率?
- SqLite c++,可以创建数据库,但不能将 anthing 插入到表中
- 如何使用C ++将SQLite数据库中的所有表从一个数据库复制到另一个数据库
- 优化使用 C++ 查询 SQLite DB 中超过 5000 万条数据记录的方式
- POST Arduino 传感器值通过 Flask API 发送到本地 Sqlite db
- 将数据从 SQLite 数据库保存到变量中
- QT Creator将SQLite复制为空数据库
- C++中的SQLite char*转换