7

我有一个内联函数

string myFunction() { return ""; }

和....相比

string myFunction() { return string(); }

它有性能牺牲吗?

在 VC2012 版本上使用 std::string 和 QString 对其进行了测试(尽管在 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;
}
4

3 回答 3

3

它们每个都会导致不同的 std::string 构造函数。

std::string() -- 将创建一个空对象。

"" 将使用 std::string(char*) 构造

后者将在内部执行第一个不需要的 strlen+strcpy,因此差异非常小。

于 2013-10-24T13:39:25.153 回答
1

在您发布的示例中,return "";return string(""); 在编译时自动翻译为。除非string("")明显慢于string(),否则应该没有太大区别。


在您的评论中,您提到您实际上使用的是QString,而不是std::string。请注意,QString()构造一个空字符串isNull()并且isEmpty()都返回 true),而QString("")构造一个空字符串isEmpty()返回 true 但isNull()返回 false)。他们不是一回事!你可以想到QString()like char * str = NULL;,和QString("")like char * str = "";

于 2013-10-24T13:40:00.740 回答
1

使用return string();,因为它将使用默认构造函数。一个好的标准库实现可能甚至不会在那时初始化字符串缓冲区。

from 的构造函数const char*必须接受一个字符串副本。所以我认为return "";会慢一些。

但是,可以肯定的是,赛马

于 2013-10-24T13:46:18.113 回答