C ++의 사전 및 사후 증가/감소 연산자가 루프에서 동일한 성능을 가지고 있습니까? [복제하다

StackOverflow https://stackoverflow.com/questions/631506

  •  08-07-2019
  •  | 
  •  

문제

두 가지 예를 고려하십시오.

class ClassOne
{
 //class definition is here
};

std::vector< ClassOne > myListOfObjects;

std::vector< ClassOne >::const_iterator iter = myListOfObjects.begin();

Example 1: 
for( ; iter < myListOfObjects.end(); **++iter**)
{
   //some operations
}

OR

Example 2: 
for( ; iter < myListOfObjects.end(); **iter++**)
{
   //some operations
}

어느 것이 더 빠르나요? 루프의 맥락에서 ++ iter 또는 iter ++.

폐쇄와 함께 이유 :

Brian의 게시물에서 복사했습니다 (질문을 더 간결하게 만들기 위해).

이러한 유사한 질문 중 하나를 시도 할 수도 있습니다. 여기 또는 여기 또는 여기 또는 여기.

도움이 되었습니까?

해결책

언급 한 바와 같이 이 답변, 프리가 더 빠릅니다. 프리미티브 (int, char 등)를 다룰 때만 동일합니다. 이 경우 그들은 과부하 된 연산자에게 전화를 걸고 있습니다.

다른 팁

아니요 동일한 성능이 없습니다.

  • Postincrement는 사본을 생성 한 다음 증가한 다음 사본을 반환합니다.
  • 사전 인증은 증가 한 다음 원본을 반환합니다

따라서 (ints와 같은 간단한 것들을 처리하지 않는 한) Pre Infincrement가 더 빠릅니다.

때에 따라 다르지. 순진한 컴파일러에서는 사전 인증이 더 빠릅니다. 의사 코드에서는 각자가하는 일이 있습니다.

preincrement() {
  val = val + 1;
  return val;
}

postincrement() {
 tmp = val; // take a temporary copy of the old value
 val = val + 1;
 return tmp;
}

실제로, 컴파일러는 자주 사후에 도망 갈 수있을 때 사전 인크 리멘트로 바꾸십시오. 그러나 복잡한 유형의 경우 그렇게 할 수 없습니다. 일반적으로 가능할 때마다 사전 진료를 사용하고 해당 작업의 특정 의미론이 필요할 때만 사용하십시오.

비 원시 유형을 다룰 때 : ++ ITER는 항상 더 효율적입니다.

이유 ++ ITER는 더 효율적이라는 것이 더 효율적입니다. 반환 값이 실제로 사용되는지 여부는 중요하지 않습니다.

차이점:

  • ++ 반복 a 그 자체에 대한 언급, 따라서 임시 사본이 필요하지 않습니다. (증분, 자신의 가치에 대한 참조를 반환)

  • iter ++는 변수의 임시 사본을 반환합니다 (오래된 값, 증분, 반환 온도 var를 가진 온도 Var 생성)

    _Myt _Tmp = *this;
    ++*this;
    return (_Tmp);
    

이러한 유사한 질문 중 하나를 시도 할 수도 있습니다. 여기 또는 여기 또는 여기 또는 여기. 반복자에게는 적용되지 않지만 정확히 동일하지 않습니다.

나는 그들이 다른 순서대로 기계 코드에서 같은 것을 줄이는 것이 거의 긍정적입니다. 나는 그것들이 동일하다고 말하지만, 나는 당신이 빠른 테스트 앱을 작성하는 것이 좋습니다.

예비 점수는 일반적으로 개입 후 특정 요구가 없다면 더 좋습니다.

그러나 이것은 컴파일러 특정 것입니다. 대부분의 최신 컴파일러는 접두사 표기법에 대한 OPS를 적게 만듭니다. 클래스 메소드 과부하를 사용하면 클래스가 구현되는 방식에 따라 다르기 때문에 항상 최적화되지는 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top