-2

C++ のさまざまなプログラムは、次のようにスコープ解決演算子を使用せずに作成されます。

#include <iostream>
#include <string>

int main()
{
std::string name = "My Name";
std::cout << name << std::endl;

return 0;
}

また、「using」キーワードの使用も見ました。

#include <iostream>
#include <string>
using namespace std;
int main()
{
string name = "My Name";
cout << name << endl;

return 0;
}

効率的な理由からどちらが優れていますか?

4

2 に答える 2

6

同じ名前が見つかると仮定すると、効率は同じです。関数名の綴りに関係なく、同じ関数が呼び出されます。主な違いは、名前の検索方法です。完全修飾を使用すると、たとえば、引数に依存するルックアップが防止されるため、理解しやすくなります。

もちろん、実際にカスタマイズ ポイントがある場合は、引数に依存するルックアップの非修飾呼び出しを使用して開始することをお勧めします。カスタマイズ ポイントのデフォルトの実装が必要ない場合は、その必要はありません。using宣言またはusing指令さえも。カスタマイズ ポイントを誤って使用すると、パフォーマンスに悪影響を及ぼす可能性があります。たとえば、修飾された名前を使用したくないswap()場合は、次のようにします。

template <typename T>
void some_function(T& v1, T& v2) {
    std::swap(v1, v2); // <--- this is bad! It uses the default implementation

    using std::swap;   // make a default implementation visible
    swap(v1, v2);      // <--- this is better: if it exists uses T's swap()
}

Tがカスタマイズされている場合は、値とのコピーが発生するswap()可能性があるよりも効率的である可能性があります。移動可能なタイプの場合、違いはそれほど悪くはありませんが、それでもかなりの差になる可能性があります。もちろん、ここでの問題は、修飾を使用するかどうかではなく、関数を呼び出す 2 つの方法によって、が に対してオーバーロードされているかどうかに応じて、異なる関数が見つかる可能性があるという事実です。std::swap()v1v2Tswap()T

ところで、効率に関心がある場合は、std::endl を使用しないでください。

于 2016-12-22T04:08:54.227 に答える
1

2 つのプログラムは、同一の実行可能コードを生成する必要があります。C++ では、名前の検索は実行時ではなくコンパイル時に行われるため、コンパイラはコンパイル中に名前を見つけ、その後は何も変更しません。実行時の評価がないため、特定の名前を見つけるために使用される構文がプログラムの効率に影響を与えることはありません。

Dietmar が言うように、構文の選択によっての名前が見つかる可能性があり、それによって動作が変わる可能性がありますが、同じ名前が見つかったと仮定すると、効率に違いはありません。

于 2016-12-22T10:53:51.727 に答える