同じ名前が見つかると仮定すると、効率は同じです。関数名の綴りに関係なく、同じ関数が呼び出されます。主な違いは、名前の検索方法です。完全修飾を使用すると、たとえば、引数に依存するルックアップが防止されるため、理解しやすくなります。
もちろん、実際にカスタマイズ ポイントがある場合は、引数に依存するルックアップの非修飾呼び出しを使用して開始することをお勧めします。カスタマイズ ポイントのデフォルトの実装が必要ない場合は、その必要はありません。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()
v1
v2
T
swap()
T
ところで、効率に関心がある場合は、std::endl を使用しないでください。