2014-01-23 3 views
3

Это код cppcheck show waring "[event.cpp: 20]: (performance) Параметр функции 'path' должен передаваться по ссылке."Почему cppcheck говорит, что «параметр функции должен передаваться по ссылке»?

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

но другой код, включая строку paramer не показывают это предупреждение, как:

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

почему?

+7

Прерывание аргументов и возвращаемых значений с помощью констант 'const' * *, поскольку оно блокирует все формы семантики перемещения. – Griwes

ответ

7

Потому что это должно быть! Нет причин передавать const-копию, вы никак не можете ее изменить, поэтому зачем ее копировать. В худшем случае придется выделять память для новой строки, а затем копировать строку по одному байту за раз. В лучшем случае это может сделать некоторую внутреннюю магию подсчета ссылок, но если вы просто передали ее по ссылке, вы, скорее всего, скопируете один указатель на новую точку в стеке. pass by const std::string& path - Это будет намного быстрее.

Параметр пути в init_watch также должен быть передан посредством ссылки на константу, потому что это тоже сделает копию.

+3

Я не могу согласиться со вторым аргументом. Вы уверены, что 'path' не изменяется в' init_path'? Если это то, то копия может быть сделана по вызову уже. – RedX

+0

Да, вы правы, мне просто интересно, почему cppceck не дает мне waring во втором случае. Может быть, cppcheck не заботится об этой ошибке? – fayewu

+0

Как сказано выше, и они правы, может быть случай для передачи неконсольной копии, если вы собираетесь манипулировать строкой дальше, но нет никаких оснований передавать в const-копию, что почему cppcheck только жалуется на первый случай – Salgar

Смежные вопросы