7

私はインライン関数を持っています

string myFunction() { return ""; }

と比べて

string myFunction() { return string(); }

パフォーマンスが犠牲になりますか?

std::string と QString を使用して VC2012 リリースでテストしました (ただし、QString では、2 つは異なる結果を返します: DaoWen のおかげです)。どちらも、2 番目のバージョンが最初のバージョンよりも約 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()を構築する(そしてどちらも true を返す) のに対し、 は空文字列を構築する( true を返すが false を返す)ことに注意してください。それらは同じものではありません!のように考えることができます。isNull()isEmpty()QString("")isEmpty()isNull()QString()char * str = NULL;QString("")char * str = "";

于 2013-10-24T13:40:00.740 に答える