2013-10-27 4 views
21
auto a = 10; 

컴파일러가 aint 인 것을 컴파일 타임 또는 런타임에 알고 있다면? 런타임에 유형을 추론하면 성능에 영향을주지 않습니까?C++ 11 자동 컴파일 시간 또는 런타임?

덕분에

+3

런타임 성능에 전혀 영향을 미치지 않습니다 –

+13

'c'와'C++ '는 정적입니다. 컴파일시에 모든 타입을 알아야한다 .' auto'는'C++ '의 일부이기 때문에 런타임 타입 검사를 요구할 수 없다. – Rubens

+4

RTTI를 다루지 않는 한 @Rubens .. – vines

답변

40

컴파일 시간과 같은 컴파일합니다. C++에서 런타임 유형 정보는 컴파일하는 동안 (RTTI 또는 가상 상속없이) 제거됩니다. 실제로, 런타임시 기본 유형을 검사하는 것은 불가능합니다.

8

그것은 어떤 성능 차이와, 컴파일시에 완전하게 이루어집니다.

auto i = 2; 

int i = 2; 
+4

입니다. 다른 예제에서는 성능 차이가있을 수 있습니다. auto는 절대 타입 변환을하지 않으므로 적어도 빠르지는 않더라도 항상 빠릅니다. –

14

다른 답변에서 언급하지 않은 사항을 추가하고 싶습니다.

  1. 모든 선언은 그래서 auto 특별한 치료를하지 않는 컴파일 타임에 알려진 유형이 있어야합니다, 그것은 컴파일 타임에 유형을 추론 할 수있다.
  2. 당신은 어떻게 auto을 사용해야하는지 잘못 해석하고 있습니다. 네, 당신은 할 수 auto i = 2; 그리고 잘 작동합니다. 그러나 자동차가 필요한 상황은 람다 (lambda)입니다. lambda에는 명명 가능 유형이 없습니다 (단, std::function에 지정할 수 있음). 클래스 나 함수 템플릿 내부에서 유용하게 사용할 수있는 또 다른 상황은 특정 작업의 유형을 파악하는 것이 매우 어려울 수 있습니다 (예 : 불가능할 수도 있음). 예를 들어 함수가 템플릿 유형에서 호출 될 때 함수가 주어진 타입에서, 여러 타입들로 인해 어떤 타입을 반환 할지를 결정하는 것이 본질적으로 불가능할 수 있습니다. 물론 decltype에 함수를 래핑하여 반환을 계산할 수 있지만 auto은 작성하는 것이 훨씬 깔끔합니다.
  3. 사람들은 또한 자신의 유형을 작성하는 꽤 고통을하기 때문에 반복자에 대한 자동에게 상당히을 사용하는 것하지만이 변수의 유형 선언 auto
+3

: +1, 나는 첫 번째와 두 번째 점을 좋아하지만 반복자를 사용하는 동안 쓰는 코드는 서툴러서 코드를 읽기 쉽도록 맹목적으로 만들 것이다. –

+0

@pranitkothari 나는 그것을하지 말아야한다는 말은 아니었다. 나는 단지 '자동'이 추가 된 이유가 아니라는 것을 말하고있다. 사람들은 그것보다 훨씬 오래 반복자를 사용하고있다. – aaronman

+0

그래, 맞아. –

5

의 의도 된 주요 용도 그래서 잘 모르겠어요 auto는 다음 코드 조각이있는 경우 즉, 컴파일시에 실시하는 것이 최적입니다.

auto i = 10; // i is an integer 
i = 3.14; // i is still an integer, will truncate to 3 

허브 셔터 (현재 C++ 표준화위원회의 담당 남자) 가능한 "자동차를 사용하도록 권장하는 것이 편리합니다 두 가지 이유가 있습니다 : 첫째, 가장 분명하게 그것은 편의입니다. hat은 우리가 이미 언급 한 타입 이름과 컴파일러가 이미 알고있는 것을 반복하지 않도록한다. 둘째로, 유형에 알 수 없거나 쉽게 말할 수없는 이름이있는 경우 (예 : 대부분의 람다 함수 유형과 달리 쉽게 또는 전혀 철자를 구사할 수없는 경우)보다 편리합니다. "(블로그의 this 게시 참조). auto의 의도 된 사용은 개발자가 작업을 쉽게하기 위해 적합 할 때마다 사용하는 것이 좋습니다.

+0

+1 링크를 제공해 주셔서 감사합니다. –

+1

설명하지 않은 세 번째 상황이 있습니다. 유형이 변경되었지만 코드가 변경되지 않은 경우입니다. 이는 컨테이너에 대한 함수를 개발할 때 발생합니다. 코드가 거의 비슷하거나 비슷하기 때문에 코드가 거의 변경되지 않으므로 유형을 변경하면 코드가 자동으로 해당 변경 사항에 적용됩니다. 즉, 재 입력하지 않아도됩니다. 자동차는 그러한 상황에서 발전하는 데 정말로 도움이됩니다. – Fred

+0

Herb Sutter는 C++ 프로그래밍 관련하여 "그가하는 일을 알고 있습니다"라고 확신합니다. 나는 'auto'를 사용할 때마다 컴파일러가 정확한 타입을 추론 할 것이라고 확신한다. 그러나 필자는 필자가 컴파일러가 추론 한 내용과 완전히 내 기대와 일치 하는지를 항상 알고 있다고 확신하지는 않습니다. 그러므로 나는 할 수있을 때마다'auto'의 사용을 막습니다. (나는 수십 년 전에 소스 코드의 명백 함이 현대적이고 개선으로 간주되었을 때를 기억한다.) – Scheff