2014-01-23 18 views
3

這是cppcheck show waring的代碼[[event.cpp:20] :(性能)函數參數'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' * values *返回值被破壞,因爲它禁止所有形式的移動語義。 – Griwes

回答

7

因爲它應該!沒有理由傳遞一個const副本,你無法修改它,所以爲什麼要複製它。在最壞的情況下,它將不得不爲一個全新的字符串分配內存,然後一次將該字符串複製一個字節。在最好的情況下,它可能會做一些內部引用計數魔術,但如果你只是通過引用傳遞它,那麼你最多隻需要將一個指針複製到堆棧中的新點。通過const std::string& path - 它會快得多。

init_watch中的路徑參數也應該由const引用傳入,因爲那也是無緣無故的複製。

+3

我不能同意第二個論點。你確定'path'沒有在'init_path'中被修改嗎?如果是,則可以在調用時創建副本。 – RedX

+0

是的,你是對的,我只是好奇爲什麼cppceck不給我在第二種情況下waring ..也許cppcheck不關心這個錯誤? – fayewu

+0

正如上面的評論所說的,他們是正確的,如果要進一步操縱字符串,可能會有一個情況下傳入非const副本,但沒有理由傳入一個const副本,它是爲什麼cppcheck只會抱怨第一種情況 – Salgar