【问题标题】:why cppcheck say "Function parameter should be passed by reference"?为什么 cppcheck 说“函数参数应该通过引用传递”?
【发布时间】:2014-01-23 10:14:41
【问题描述】:

这是cppcheck show warning "[event.cpp:20]: (performance) Function parameter 'path' should be pass by reference."的代码

void
event::set_path(const std::string path)
{
    this->_path = path;
}

但包括字符串参数在内的其他代码不显示此警告,例如:

int
watcher::init_watch(const struct stat *sb, std::string path, bool linked)
{
    int wd;
        ....
}

为什么?

【问题讨论】:

  • 通过const values 传递参数和返回值被破坏,因为它禁止所有形式的移动语义。

标签: c++ cppcheck


【解决方案1】:

因为它应该!没有理由传递一个 const 副本,反正你也不能修改它,那为什么要复制它。在最坏的情况下,它必须为一个全新的字符串分配内存,然后一次复制一个字节的字符串。在最好的情况下,它可能会做一些内部引用计数魔法,但如果你只是通过引用传递它,那么你最多将一个指针复制到堆栈中的新点。路过const std::string& path - 会快很多。

init_watch 中的路径参数也应该通过 const 引用传入,因为那样也会无缘无故地复制。

【讨论】:

  • 我不能同意第二个论点。你确定path 没有在init_path 中被修改吗?如果是,则可以在调用时制作副本。
  • 是的,你是对的,我只是好奇为什么 cppceck 在第二种情况下不给我警告。也许 cppcheck 不关心这个错误?
  • 正如上面的评论所说,他们是对的,如果你要进一步操作字符串,可能会有一个非常量副本传入的情况,但没有理由通过在 const 副本中,这就是为什么 cppcheck 只抱怨第一种情况
  • @fayewu 这不是错误。 "...." 的内容在解释 cppcheck 的 advice 时非常重要
猜你喜欢
  • 2013-11-08
  • 2012-06-24
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多