2016-12-22 1 views
-2

다양한 프로그램을 네임 스페이스 이름을 사용 :C++ 키워드 "사용"또는 범위 결정 연산자 이런 식으로 범위 결정 연산자를 사용하지 않고 작성된 C++에서

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

return 0; 
} 

효율성면에서 어느 것이 더 낫습니까?

+1

효율성에 차이가 없습니다. –

+0

범위 해석 연산자를 사용하지 않고 무엇을 의미합니까 _ "? 귀하의 예제에서는 그것을 두 번 사용합니다. _with_를 의미합니까? –

답변

6

동일한 이름이 나오면 효율은 같습니다. 함수 이름의 철자가 어떻게 동일한 함수가 호출되는지에 관계없이 동일합니다. 가장 큰 차이점은 이름을 찾는 방법입니다. 완전한 자격을 사용하면 예를 들어 인수에 의존하는 룩업 (look-up)이 방지되므로 이해하기 쉽습니다.

물론 사용자 정의 포인트가있는 경우 인수 종속적 인 조회가 필요없는 정규화되지 않은 호출을 사용하고자 할 것입니다. 사용자 정의 포인트에 대한 기본 구현이 필요하지 않은 경우 using 선언이나 심지어 using 지시문을 가질 필요가 없습니다. 사용자 지정 지점을 잘못 사용하면 에 부정적인 영향을 미칩니다. T는 사용자 정의 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() 
} 

경우 가능성이 더 효율적 std::swap()보다 값 v1v2의 사본의 원인이 될 수 있습니다 : swap()를 사용하는 경우 예를 들어, 하지 자격이 이름을 사용할까요. 이동 가능 유형 T과의 차이는 그다지 나쁘지는 않지만 여전히 상당 할 수 있습니다. 물론 여기서의 문제는 자격의 사용이나 자격의 사용이 아니라, swap()T으로 오버로드되었는지 여부에 따라 함수를 호출하는 두 가지 방법이 서로 다른 기능을 찾을 수 있다는 사실입니다.

BTW, 효율성에 관심이 있으시면 do not use std::endl!

+0

그래서 endl 대신 '\ n'을 사용해야합니까? –

+0

@ProthomOntim : 예 - 스트림을 항상 플러시하지 않습니다. –

+0

@ T.C .: 좋은 지적. 'std :: vector'를 사용하지 않도록 코드 스 니펫을 변경했습니다. –

1

두 프로그램은 동일한 실행 코드를 만들어야합니다. C++에서 이름 검색은 런타임이 아닌 컴파일 타임에 발생하므로 컴파일러는 컴파일하는 동안 이름을 찾은 다음 나중에 변경되지 않습니다. 런타임 평가가 없기 때문에 주어진 이름을 찾는 데 사용 된 구문은 프로그램의 효율성에 영향을 줄 수 없습니다.

Dietmar에 따르면 구문을 선택하면 과 다른이라는 이름이 발견되어 동작이 변경 될 수 있지만 동일한 이름이 있으면 효율성에 차이가 없음을 가정합니다.

관련 문제