假设你有一个全局的类(例如可用于应用程序的运行时)
class MyClass {
protected:
std::string m_Value;
public:
MyClass () : m_Value("hello") {}
std::string value() { return m_Value; }
};
MyClass v1;
Run Code Online (Sandbox Code Playgroud)
当我这样做时,使用第一种形式给了我奇怪的行为
printf("value: %s\n", v1.value().c_str());
Run Code Online (Sandbox Code Playgroud)
看起来字符串在printf可以使用之前从内存中消失了.有时它打印值:hello其他时候它崩溃或什么都不打印.
如果我第一次复制字符串就像这样
std::string copiedString = v1.value();
printf("value: %s\n", copiedString.c_str());
Run Code Online (Sandbox Code Playgroud)
事情确实有效.
当然必须有一种方法可以避免使用临时字符串.
编辑:所以共识是使用const std :: string和返回值.
我知道每个人都说原始代码应该没问题,但我可以告诉你,我在Windows CE上看到MSVC 2005遇到了麻烦,但只能在CE盒子上.不是Win32交叉编译.
大家好,我有一个代码,它位于一个迭代树的大循环中.这是我能得到这个例程的速度,但我必须使用goto.我并不是从根本上反对goto,但如果我能避免它们,我愿意.(请不要试图开始一场火焰战争.)
约束:
current=current->child()是昂贵的(这是一个shared_ptr)所以我想不惜一切代价尽量减少使用该操作.current应该是它找到的最后一个孩子.cnt 必须统计它遇到的每个孩子.代码:
insideloopy:
cnt++;
if ( current->hasChild() )
{
current = current->child();
goto insideloopy;
}
Run Code Online (Sandbox Code Playgroud)
编辑:对不起家伙,原本忘了提cnt ++应该只出现一次.它将是节点上的某种操作,因此应该只有一次.我也试图避免进行另一个函数调用.
作为我关于这段代码的一小段原始问题的后续跟踪,我决定跟进,看看你能做得更好,然后到目前为止我们想出的是什么.
下面的代码遍历二叉树(左/右=子/下).我相信这里有一个较少的条件空间(down布尔值).最快的答案获胜!
cnt语句可以是多个语句,因此请确保它只出现一次child()和next()成员函数约为30X一样慢的hasChild()和hasNext()操作.目前,此代码在测试树中访问62200000个节点需要5897ms,将此功能调用200,000次.
void processTree (BaseNodePtr current, unsigned int & cnt )
{
bool down = true;
while ( true )
{
if ( down )
{
while (true) {
cnt++; // this can/will be multiple statesments
if (!current->hasChild()) break;
current = current->child();
}
}
if ( current->hasNext() )
{
down = true;
current = current->next();
}
else
{
down = false; …Run Code Online (Sandbox Code Playgroud) 我正在使用Qt数据库抽象层与Sqlite3进行交互.
int x = GetTickCount();
database.exec("UPDATE controls SET dtype=32 WHERE id=2");
qDebug() << GetTickCount()-x;
Run Code Online (Sandbox Code Playgroud)
该表是:
CREATE TABLE controls (
id INTEGER PRIMARY KEY AUTOINCREMENT,
internal_id TEXT,
name TEXT COLLATE NOCASE,
config TEXT,
dtype INTEGER,
dconfig TEXT,
val TEXT,
device_id INTEGER REFERENCES devices(id) ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)
结果更新时间约为100毫秒!即使没有其他任何东西正在访问数据库,并且该表中总共有3条记录.
这对我来说似乎很荒谬.10条记录已经需要一秒钟才能完成.这是我应该从sqlite中获得的性能还是让我搞砸到某个地方的东西?SELECT查询足够快〜1ms.
所以这不是Qt.
sqlite3 *db;
if ( sqlite3_open("example.db",&db ) != SQLITE_OK )
{
qDebug() << "Could not open";
return;
}
int x = GetTickCount();
sqlite3_exec(db, "UPDATE controls SET dtype=3 WHERE id=2",0,0,0); …Run Code Online (Sandbox Code Playgroud) c++ ×4
binary-tree ×1
goto ×1
iteration ×1
optimization ×1
qt ×1
refactoring ×1
return-value ×1
sql ×1
sqlite ×1
stdstring ×1