programing

for 루프에서 ++ i 또는 i ++ ??

procenter 2021. 1. 16. 10:42
반응형

for 루프에서 ++ i 또는 i ++ ??


중복 가능성 :
C ++에서 i ++와 ++ i간에 성능 차이가 있습니까?

일부 프로그래머가 작성 ++i하는 대신 일반 for 루프로 작성 하는 이유가 i++있습니까?


정수의 경우 사전 증가와 사후 증가간에 차이가 없습니다.

i가 사소하지 않은 클래스의 객체 인 경우 ++i일반적으로 선호되는 이유는 객체가 수정 된 다음 평가되기 때문입니다. 반면 i++평가 후에 수정되므로 복사본을 만들어야합니다.


++i 의미론으로 인해 약간 더 효율적입니다.

++i;  // Fetch i, increment it, and return it
i++;  // Fetch i, copy it, increment i, return copy

int와 유사한 인덱스의 경우 효율성 향상이 최소화됩니다 (있는 경우). 반복기 및 기타 더 무거운 객체의 경우 해당 복사를 피하는 것이 진정한 승리가 될 수 있습니다 (특히 루프 본문에 많은 작업이 포함되지 않은 경우).

예를 들어, 임의 정밀도 정수를 제공하는 이론적 BigInteger 클래스를 사용하는 다음 루프를 고려하십시오 (따라서 일종의 벡터와 유사한 내부).

std::vector<BigInteger> vec;
for (BigInteger i = 0; i < 99999999L; i++) {
  vec.push_back(i);
}

해당 i ++ 작업에는 기본적으로 인덱스 개체의 복사본을 하나 더 만드는 것 이상을 수행하지 않는 루프에 대한 복사 생성 (예 : 새 연산자, 숫자 단위 복사) 및 제거 (연산자 삭제)가 포함됩니다. 기본적으로 접두사로 충분할 수있는 접미사 증분을 사용하여 수행 할 작업을 두 배로 늘 렸습니다 (그리고 메모리 조각화 가능성이 가장 높음).


++i사전 증분입니다. i++후 증가입니다.
사후 증가의 단점은 추가 값을 생성한다는 것입니다. 수정하는 동안 이전 값의 복사본을 반환 합니다 i. 따라서 가능하면 피해야합니다.


정수를 사용하면 선호합니다.

루프 변수가 클래스 / 객체 인 경우 차이를 만들 수 있습니다 (프로파일 링 만 중요한 차이인지 알려줄 수 있음). 사후 증가 버전에서는 폐기되는 해당 객체의 복사본을 만들어야하기 때문입니다.

복사본을 만드는 것이 비용이 많이 드는 작업이라면, 루프를 통과 할 때마다 아무런 이유없이 그 비용을 한 번 지불하게됩니다.

항상 ++iin for 루프를 사용하는 습관을 들이면 이 특정 상황에서 수행하는 작업이 합당한 지 생각할 필요가 없습니다. 당신은 항상 그렇습니다.


그 이유는 바로 성능입니다. i ++는 복사본을 생성하므로 즉시 폐기하면 낭비입니다. 물론, 컴파일러는이 복사본이 i프리미티브 인 경우 최적화 할 수 있지만 그렇지 않은 경우 최적화 할 수 없습니다. 질문을 참조하십시오 .


소금의 무게에 해당하는 컴파일러는

for(int i=0; i<10; i++)

for(int i=0;i<10;++i)

++ i와 i ++ 의 비용은 동일 합니다. 유일한 차이점은 ++ i의 반환 값은 i + 1이고 i ++의 반환 값은 i라는 것입니다.

따라서 ++ i를 선호하는 사람들에게는 타당한 정당성이 없으며 개인적인 선호도가있을 수 있습니다.

편집 : 이것은 다른 모든 게시물에 대해 언급했듯이 수업에 잘못되었습니다. i ++는 내가 클래스 인 경우 복사본을 생성합니다.


다른 사람들이 이미 언급했듯이 사전 증가는 일반적으로 사용자 정의 유형의 사후 증가보다 빠릅니다. 그 이유를 이해하려면 두 연산자를 모두 구현하는 일반적인 코드 패턴을 살펴보십시오.

Foo& operator++()
{
    some_member.increase();
    return *this;
}

Foo operator++(int dummy_parameter_indicating_postfix)
{
    Foo copy(*this);
    ++(*this);
    return copy;
}

보시다시피 접두사 버전은 단순히 객체를 수정하고 참조로 반환합니다.

반면에 접미사 버전은 실제 증가가 수행되기 전에 복사본을 만들어야하며 그 복사본은 값별로 호출자에게 다시 복사됩니다. 소스 코드에서 접두사 버전에 대한 호출이 포함되어 있으므로 접미사 버전이 더 많은 작업을 수행해야한다는 것이 분명합니다.++(*this);

내장 당신은 값을 폐기로 유형, 그것은 즉만큼 당신이 포함되지 않는 한만큼 어떤 변화를하지 않는 ++ii++같은 더 큰 식 a = ++i또는 b = i++.


개인의 취향.

Usually. Sometimes it matters but, not to seem like a jerk here, but if you have to ask, it probably doesn't.


when you use postfix it instantiates on more object in memory. Some people say that it is better to use suffix operator in for loop

ReferenceURL : https://stackoverflow.com/questions/4261708/i-or-i-in-for-loops

반응형