답변
오래된 값이 반환되기를 원하는 경우 명백한 점은 후행 증가를 사용하는 것입니다.
더 미묘한 점은 사전 증가가 실제로 느려지지 않아야하며 임시 증가를 생성하지 못하고 이후 증가를 사용할 때 이전 값을 반환하지 않아 더 빠를 수 있다는 것입니다.
C++에서 사후 증가를 사용하는 실제 시나리오는 표준 컨테이너에서 지울 때입니다. 예를 들어 컴파일러 최적화에 대응
set<int> ctr;
ctr.insert(1);
ctr.insert(10);
ctr.insert(12);
ctr.insert(15);
set<int>::iterator it = set.begin();
// Post-increment so the value returned to erase is that of the previous
// iteration (i.e. begin()), yet the iterator stays valid due to the local
// iterator being incremented prior to the erase call
ctr.erase(it++);
// Still valid iterator can be used.
cout << "Value: " << *it << "\n";
, 그것은 사실이다 그러나 나는 그것이로 정확하게 당신이 달성하기 위해 노력하고 무엇 가능한 전달하는 것이 중요하다고 생각합니다. x ++에서 반환 된 값이 필요하지 않다면 요청하지 마십시오. 또한 증가 유형이 단순 유형이 아닌 경우에도 항상 동일한 최적화를 얻지 못할지 잘 모르겠습니다. 단순한 포인터가 아닌 반복자를 생각해보십시오. 이와 같은 경우에는 최적화와 관련하여 마일리지가 다를 수 있습니다. 즉, 후행 증가 연산자의 반환 값 (예 : 이전 값)이 필요하지 않는 한 항상 미리 증가됩니다.
+1입니다. –
사실 거의 모든 컴파일러는 일반적인 상황 (연산 결과가 무시되고 i가 과부하 증가/감소 연산자가없는 경우)에서'+++ '로 최적화 할 것이라고 생각합니다. 즉, 포스트 증가/감소 대신 사전 증가/감소를 선호하는 것으로 나타났습니다. 이는 액션의 의미를 더 잘 전달한다고 생각하기 때문입니다. 'i'가 커스텀'++'/'- '연산자를 가진 사용자 정의 타입이된다면 속도가 빨라질 것입니다. – bcat
@bcat이 당신과 동의합니다. 대부분의 경우 사전 승격에 의미가 있으며, 학교에서 가르 칠 때 이것이 왜 그렇게 큰 이유인지 확신 할 수 없습니다. –
의 차이를 명확히하기 위해 최선의 설명은 다음과 같습니다
- 내가 + + - 다음 내가 값을 어떤이 보유하고 값에 대한 i 값을 사용하여 증가하고, 을 보관
- ++ i - i의 값을 증가시키고 즉시 저장합니다. 다음에이 값을 사용합니다. 결정적인 차이 문이 평가 후에 하나 개의 단위입니다
는, 다른 하나는 문이 평가 전에 증가합니다.
불행히도 Stackoverflow에는 평범한 영어가 정말 부족합니다. – MarcusJ
특별히 ++i
의 동작이 필요하지 않는 한 i++
을 사용하는 것이 좋습니다. 이는 왼쪽에 변수를 넣기 때문에 i += N
과 일치합니다. 대부분이 사소한,하지만
for (i = 0; i < limit; ++i)
병렬 구조의 부족과 함께 독자를 여행 때문에-for 루프에서, 나는 잘못로 ++i
을 고려하고 ...하는 김에 i++
로 변경한다;
for (i = 0; i < limit; i++)
루프 변수가 모든 세 절에서 동일한 위치에 있기 때문에 읽기가 훨씬 편리합니다.
성능 관련 인수는 hogwash입니다. 그 소금의 가치가있는 컴파일러는 차이가없는 경우 동일한 코드를 생성합니다.예, 여기에는 C++ 오버로드 된 연산자가 포함됩니다.
- 1. ClassDefiner는 언제 사용됩니까?
- 2. vtable은 언제 사용됩니까?
- 3. initform은 언제 사용됩니까?
- 4. initWithFormat : arguments는 언제 사용됩니까?
- 5. 임시 데이터베이스는 언제 사용됩니까?
- 6. Delphi에서 System.IsConsole이 언제 사용됩니까?
- 7. savedInstanceState는 실제로 언제 사용됩니까?
- 8. StringIO는 언제 사용됩니까?
- 9. 인스턴스 변수는 언제 사용되며 속성은 언제 사용됩니까?
- 10. 시스템 호출 set_tid_address는 언제 사용됩니까?
- 11. 우주선 운영자는 언제 외부에서 사용됩니까?
- 12. 명시 적 인스턴스화 - 언제 사용됩니까?
- 13. $ (function() {...}) 함수는 무엇이며 언제 다음 예제에서 호출됩니까?
- 14. Javascript Regex가 선행 및 사후 문자와 일치하는 문자열을 확인합니다.
- 15. ContentLength 대 실제 File.Length
- 16. 필드 대 실제 성능
- 17. LEB128 (u/s)는 언제 사용됩니까?
- 18. SQL - 빈 OVER 절은 언제 사용됩니까?
- 19. "실제 사용"사례 항목 .__ dict __. iteritems()가 사용됩니까?
- 20. EntityFramework는 C#으로 실제 생활에서 어떻게 사용됩니까?
- 21. .net 예제에서 인수를 참조로 전달해야합니까?
- 22. Mockery 대 JUnit4Mockery는 언제 사용해야합니까?
- 23. 요소 대 특성은 언제 사용해야합니까?
- 24. NSCoder 대 NSDictionary, 언제 사용합니까?
- 25. 'The Little Schemer'의 예제에서 실제 스키마로 변경된 구문
- 26. 이 Java 예제에서 실제 유형 대신 클래스를 사용하는 이유는 무엇입니까?
- 27. 누락 : 속성 ID 코드를 실제 예제에서 복사 한 후?
- 28. 가상 대 실제 메모리 누수
- 29. Android 에뮬레이터 대 실제 장치
- 30. 파일에서 선행 공백 제거
다음을 포함하여 많은 질문이 중복되어 있습니다. http://stackoverflow.com/questions/24886/ http://stackoverflow.com/questions/467322/ http://stackoverflow.com/questions/1907140/http://stackoverflow.com/questions/484462/ http://stackoverflow.com/questions/467322/ http://stackoverflow.com/questions/24853/ –
이것은 실제 사례를 요구하면서 중복되지 않습니다. . 아래의 RC의 대답을 참조하십시오. –
계속 : http://stackoverflow.com/questions/561588/what-is-more-efficient-i-or-i http://stackoverflow.com/questions/24901/ http://stackoverflow.com/questions/ 53455/http://stackoverflow.com/questions/1116735/i-less-efficient-than-i-how-to-show-this http://stackoverflow.com/questions/3072421/difference-between-i-and -i http://stackoverflow.com/questions/2315705/what-is-the-difference-between-ii-in-for-loop-java –