如果在該函數中完成的所有操作都是爲了複製該字符串,我應該總是通過const引用將std :: string傳遞給函數嗎?另外,按值傳遞和按引用傳遞之間有什麼區別(性能或其他)?據我所知,一個使用operator=
和其他複製構造函數。是這樣嗎?我應該如何將std :: string傳遞給函數?
11
A
回答
19
如果在函數內部完成的所有工作都是複製該字符串,我是否應該總是通過const引用將std :: string傳遞給函數?
不。如果您打算只複製函數內的字符串,您應該傳遞值。這允許編譯器執行幾個優化。欲瞭解更多信息,請閱讀Dave Abraham的"Want Speed? Pass by Value."
傳遞值和傳遞參考之間有什麼區別(perf或其他)?據我所知,一個使用operator =和另一個拷貝構造函數。是這樣嗎?
不,這並非如此。參考不是一個對象;它是對一個對象的引用。當您按值傳遞時,會傳遞一個正在傳遞的對象的副本。當您通過引用傳遞時,會對現有對象進行引用,並且沒有副本。 A good introductory C++ book將詳細解釋這些基本概念。如果您想用C++開發軟件,理解基礎知識至關重要。
27
不要相信你在互聯網上閱讀的所有東西。最好通過const引用傳遞。爲了讓證明,我寫了一個測試程序...
TEST.CPP:
#include <ctime>
#include <iostream>
#include <string>
void foo(std::string s);
void bar(const std::string& s);
int main() {
const std::string s("test string");
clock_t start = clock();
for (int it = 0; it < 1000000; ++it)
foo(s);
std::cout << "foo took " << (clock() - start) << " cycles" << std::endl;
start = clock();
for (int it = 0; it < 1000000; ++it)
bar(s);
std::cout << "bar took " << (clock() - start) << " cycles" << std::endl;
}
aux.cpp:
#include <string>
std::string mystring;
void foo(std::string s) { mystring = s; }
void bar(const std::string& s) { mystring = s; }
與「G ++ -O3 TEST.CPP aux.cpp編譯'並得到打印輸出:
foo took 93044 cycles
bar took 10245 cycles
通過引用傳遞更快一個數量級。
相關問題
- 1. 如何將std :: string傳遞給glShaderSource?
- 2. 將ptr傳遞給返回的std :: string
- 3. 將臨時std :: string傳遞給boost :: regex_match
- 4. 將std :: string傳遞給本地線程
- 5. 將std :: shared_ptr傳遞給構造函數
- 6. 如何將ifstream作爲參數傳遞給std :: thread函數?
- 7. 我應該將sympy符號傳遞給函數嗎?
- 8. 我可以將參數傳遞給std :: vector排序函數嗎?
- 9. 編譯器是否將std :: string傳遞給堆棧,並將其傳遞給C++中的函數?
- 10. 如何將r值std :: vector傳遞給函數?
- 11. 如何將std :: shared_ptr <Resource>傳遞給函數?
- 12. 我應該將Backgroundworker傳遞給方法
- 13. 我如何將map <string,string>傳遞給py中的API?
- 14. 將我的compar函數傳遞給std :: multiset與C++ 11
- 15. 將std :: shared_ptr傳遞給std :: thread的函數對象
- 16. 將std :: shared_ptr << std :: vector <double>>傳遞給函數
- 17. 如何將參數傳遞給傳遞給mapPartitions的函數?
- 18. 如何將-std = c99傳遞給g ++?
- 19. 如何將參數傳遞給函數
- 20. 如何將參數傳遞給函數?
- 21. 如何將傳遞給main(在argv中)的參數傳遞給我的函數?
- 22. C#靜態類:我應該將該對象傳遞給構造函數嗎?
- 23. 應該將什麼參數傳遞給異步函數
- 24. 如何將我的函數返回值傳遞給父函數
- 25. 將Getopt :: Std傳遞給零
- 26. 如何將std :: function對象傳遞給函數指針的函數?
- 27. 當函數作爲參數傳遞時,參數如何傳遞給該函數?
- 28. 如何將值傳遞給javascript函數?
- 29. 如何將文件傳遞給函數?
- 30. 如何將函數傳遞給Perl子?
當您通過引用傳遞時,不會進行復制。當你傳值時,使用複製構造函數。 – Anycorn 2010-10-11 05:23:10