返回间接类型对象会影响性能吗?

时间:2013-10-24 13:36:08

标签: c++

我有一个内联函数

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;
}

3 个答案:

答案 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 "";会慢一些。

但是,要确定,比赛你的马