如果在该函数中完成的所有操作都是复制该字符串,我是否应该总是通过const引用将std :: string传递给函数?另外,传递值和通过引用传递之间的差异(性能或其他)是什么?据我所知,一个使用operator=
和另一个复制构造函数。是这样的吗?
答案 0 :(得分:28)
不要相信你在网上看到的一切。传递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 :(得分:20)
如果在该函数中完成的所有操作都是复制该字符串,我是否应该总是通过const引用将std :: string传递给函数?
没有。如果您要复制函数内部的字符串,则应该按值传递。这允许编译器执行多个优化。有关更多信息,请阅读Dave Abraham的"Want Speed? Pass by Value."
传递值和传递引用之间有什么区别(perf或其他)?据我所知,一个使用operator =和另一个复制构造函数。是这样的吗?
不,这根本不是。引用不是对象;它是对象的引用。传递值时,会传递要传递的对象的副本。当您通过引用传递时,将对现有对象进行引用,并且没有副本。 A good introductory C++ book将详细解释这些基本概念。如果要用C ++开发软件,了解基础知识至关重要。