小编Ron*_*Ron的帖子

如何正确返回std :: string(或如何正确使用返回值)

假设你有一个全局的类(例如可用于应用程序的运行时)

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交叉编译.

c++ return-value stdstring

8
推荐指数
2
解决办法
3442
查看次数

你能不用goto重写这个片段吗?

大家好,我有一个代码,它位于一个迭代树的大循环中.这是我能得到这个例程的速度,但我必须使用goto.我并不是从根本上反对goto,但如果我能避免它们,我愿意.(请不要试图开始一场火焰战争.)

约束:

  1. current=current->child()是昂贵的(这是一个shared_ptr)所以我想不惜一切代价尽量减少使用该操作.
  2. 手术后current应该是它找到的最后一个孩子.
  3. cnt 必须统计它遇到的每个孩子.
  4. cnt ++将被其他一些操作(或几个操作)取代,并且只应出现一次:)

代码:

insideloopy:
cnt++;
if ( current->hasChild() )
{
    current = current->child();
    goto insideloopy;
}
Run Code Online (Sandbox Code Playgroud)

编辑:对不起家伙,原本忘了提cnt ++应该只出现一次.它将是节点上的某种操作,因此应该只有一次.我也试图避免进行另一个函数调用.

c++ refactoring goto

4
推荐指数
3
解决办法
663
查看次数

树迭代器,你能进一步优化吗?

作为我关于这段代码的一小段原始问题的后续跟踪,我决定跟进,看看你能做得更好,然后到目前为止我们想出的是什么.

下面的代码遍历二叉树(左/右=子/下).我相信这里有一个较少的条件空间(down布尔值).最快的答案获胜!

  1. cnt语句可以是多个语句,因此请确保它只出现一次
  2. child()next()成员函数约为30X一样慢的hasChild()和hasNext()操作.
  3. 保持迭代< - 放弃此要求,因为呈现的递归解决方案更快.
  4. 这是C++代码
  5. 访问节点的顺序必须保持原样,如下例所示.(首先击中父母然后是孩子然后是'下一个'节点).
  6. BaseNodePtr是一个boost :: shared_ptr,因为赋值很慢,避免任何临时的BaseNodePtr变量.

目前,此代码在测试树中访问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)

c++ iteration optimization binary-tree

1
推荐指数
1
解决办法
2341
查看次数

SQLite UPDATE 100ms

我正在使用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.


编辑1

所以这不是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++ sql sqlite qt

1
推荐指数
1
解决办法
1399
查看次数