我有一个内联函数
string myFunction() { return ""; }
与
相比string myFunction() { return string(); }
是否有性能牺牲?
使用std :: string和QString在VC2012版本 上测试它(虽然在QString上,两者返回不同的结果:感谢DaoWen)。两者都显示第二个版本比第一个版本快3倍。感谢您的所有答案和评论。测试代码附在
下面#include <iostream>
#include <string>
#include <ctime>
using namespace std;
inline string fa() { return ""; }
inline string fb() { return string(); }
int main()
{
int N = 500000000;
{
clock_t begin = clock();
for (int i = 0; i < N; ++i)
fa();
clock_t end = clock();
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
cout << "fa: " << elapsed_secs << "s \n";
}
{
clock_t begin = clock();
for (int i = 0; i < N; ++i)
fb();
clock_t end = clock();
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
cout << "fb: " << elapsed_secs << "s \n";
}
return 0;
}
答案 0 :(得分:3)
它们将导致不同的std :: string构造函数。
std :: string() - 将创建一个空对象。
“”将使用std :: string(char *)
构造后者将在内部执行strlen + strcpy,这在第一个中是不需要的,所以非常小的区别。
答案 1 :(得分:1)
在您发布的示例中,return "";
将在编译时自动转换为return string("");
。除非string("")
显着慢于string()
,否则应该没有太大差异。
在您的评论中,您提到您实际使用的是QString
,而不是std::string
。请注意QString()
构造空字符串(isNull()
和isEmpty()
都返回true),而QString("")
构造空字符串(isEmpty()
返回true,但isNull()
返回false)。 他们不是一回事!您可以将QString()
视为char * str = NULL;
,将QString("")
视为char * str = "";
。
答案 2 :(得分:1)
使用return string();
,因为它将使用默认构造函数。一个好的标准库实现可能甚至不会在那时初始化字符串缓冲区。
来自const char*
的构造函数必须采用字符串副本。所以我认为return "";
会慢一些。
但是,要确定,比赛你的马。