전위는
Foo& Foo::operator++(void)
{
    //Do something here
    return *this;
}

후위는
const Foo Foo::operator++(int)
{
    const Foo ret = *this;
    ++(*this);
    return ret;
}

대개 이렇게 구현되는데,
보통의 컴파일러들은 이들을 최적화할 때, 두 가지를 고려하는데,
첫째는 함수 인라인화,
둘째는 반환 값 최적화(RVO).

이 Foo란 객체에 전위/후위연산자가 호출이 되면,
보통 전위/후위연산자 함수 코드가 길지 않기 때문에 인라인화를 하게 되는데,
특히 후위연산자가 호출 되었을 때에는,
반환값이 필요하지 않은 경우에 const Foo ret = *this;구문과 return ret; 구문을 생략하고,
그 자리에 operator++(void)를 인라인화 시키면서 operator(int)도 인라인화 하기 때문에

결국엔 후위연산자의 반환값이 필요 없는 경우에는,
사용자 정의 형에서도 전위/후위 연산자도 똑같은 부하를 갖게 된다.

ㅇㅇ