2010-07-14 5 views
4

int fkt (int &i) { return i ++; }i ++ 구문을 사용하여 int i를 하나 이상 증가시킬 수 있습니까?

int main() 
{ 
    int i = 5; 
    printf("%d ", fkt(i)); 
    printf("%d ", fkt(i)); 
    printf("%d ", fkt(i)); 
} 

지문 '5 6 7'. 이렇게 '5 7 9'를 인쇄하고 싶다면 fkt()에 임시 변수가없는 비슷한 방식으로 할 수 있습니까? 내가 필요가 무엇 무엇인지, 그것을 돌려 그럼 난, 즉

return i+=2 

또는

return i, i+=2; 

첫번째 증가 모두 같은 것을 (A 임시 변수는 소폭? 바로, 효율성을 감소 것)합니다.

감사

편집 : 주된 이유는, 내가 함수에을하고 FKT는 함수 포인터되기 때문에하지 벗어납니다. 원래 함수는 i와 다른 것을 할 것입니다. 나는 그저 {int temp = i; i + = 2; return temp;}는 {return i ++;}만큼 좋지 않습니다.

printf는 상관하지 않습니다. 이는 결과 사용에 대한 예시 일뿐입니다.

EDIT2 : 와우, 전통적인 게시판보다 채팅이 더 많습니다. 모든 답변에 감사드립니다. 내 fkt 실제로이 있습니다. get_it_1를 들어

unsigned int (*get_it)(char*&); 

unsigned int get_it_1(char* &s) 
    {return *((unsigned char*) s++);} 
unsigned int get_it_2(char* &s) 
    {unsigned int tmp = *((unsigned short int*) s); s += 2; return tmp;} 
unsigned int get_it_4(char* &s) 
    {unsigned int tmp = *((unsigned int*) s); s += 4; return tmp;} 

, 그것은 내가 ...

을 미래에 더 많은 배경을 제공하려고합니다 ... 너무 간단하다 : 어떤 조건에 따라, 나도 get_it_1, get_it_2, 또는 get_it_4로 get_it을 정의합니다
+0

printf ("% d", fkt (fkt (i)))? –

+14

이러한 효율성 고려 사항을 무시하고 작동하는 솔루션을 사용하십시오. – Philipp

+21

나는 printf가 i + = 2보다 천천히 느리다는 것을 알고 싶다. –

답변

28

"A temporary variable would marginally decrease efficiency, right?"

틀린.

측정 해 보셨나요? ++은 PDP-11에서만 마법의 효율성을 갖습니다. 대부분의 다른 프로세서에서는 +=1과 같습니다. 실제 차이점이 실제로 무엇인지 확인하려면 두 가지를 측정하십시오.

+26

마법의 pdp-11 능력 +1 –

+2

컴파일러 최적화로 인해 차이가 없어야합니다. ... – Quonux

+5

PDP-11에서는 컴파일러 최적화가 인간에 의해 수행됩니다.) – Artelius

18

(A temporary variable would marginally decrease efficiency, right?)

이것이 주된 이유 인 경우 너무 일찍 걱정하는 것입니다. 실제 성능 문제가 발생할 때까지 컴파일러를 추측하지 마십시오.

fkt가 다른 금액을 i에 추가 할 수있게하려면 매개 변수를 전달해야합니다. +=보다 ++을 선호하는 중요한 이유는 없습니다. 그냥 질문에 대답

return (i += 2) - 2 

,하지만 난 당신이 임시 변수를 사용하여 무서워한다고 생각하지 않습니다 : 당신은 두 번 증가 할 수

+5

+1 : "당신은 너무 일찍 걱정하고 있습니다." –

+6

+1 : "컴파일러를 추측하지 마십시오." 인생에 대한 좋은 좌우명. – bgs264

9

는 다음과 같은 일을 뺍니다.

+1

실제 질문에 대한 최선의 답변입니다. 나는 너와 그 임시적인 것이 더 좋을 것이라는 다른 대답에 동의한다. –

+0

덕분에, 매우 똑똑! –

+2

효율성 측면에서 gcc 4.4.1 -O2로 컴파일하면 임시 어셈블리를 사용하는 것과 똑같은 어셈블리가 생성됩니다. – indiv

2

"임시 변수"는 i ++가 내부적으로 이전 상태를 유지해야하므로 (즉, 임시 변수라고하는 것을 암시 적으로 사용하므로) 성능이 저하 될 가능성이 거의 없습니다. 그러나 2로 증가하는 데 필요한 명령어는 ++에 사용되는 명령어보다 느릴 수 있습니다.

당신은 시도 할 수 있습니다 : 당신이 비교할 수

int fkt(int &i) 
{ 
    ++ii; 
    return i++; 
} 

: 말했다

int fkt(int &i) 
{ 
    int t = i; 
    i += 2; 
    return t; 
} 

, 당신이 조기에 이러한 성능 고려 사항 일을해야한다고 생각하지 않습니다.

4

정말 속도가 필요한 경우 컴파일러가 출력하는 어셈블리 코드를 확인하십시오. 당신이 할 경우는 거 얻을 것만큼 좋은

printf("%d ", i); 
i+=2; 

: 같은으로 기능을 인라인 동안

int t = i; 
i+=2; 
return t; 

다음 컴파일러를 최적화 할 수 있습니다.

편집 : 이제 함수 포인터를 통해이 함수로 이동한다고 가정 해 보겠습니다. 포인터로 함수를 호출하는 것은 임시 변수를 사용하는 것에 비해 상당히 느립니다. 확실하지는 않지만 Intel의 문서에서 Core 2s와 i7s의 약 20 ~ 30 cpu cycle, 즉 함수 코드가 모두 캐시에 있다는 것을 기억하고 있다고 생각합니다. 컴파일러는 포인터에 의해 호출 될 때 함수를 인라인 할 수 없기 때문에 ++는 어쨌든 임시 변수를 생성합니다.

3

A temporary variable would marginally decrease efficiency, right?

"조기 최적화는 모든 악의 근원"이라고 항상 고려하십시오. 다른 부분에 시간을 투자 한 다음이를 최적화하십시오. + =와 ++는 아마도 같은 결과를 낳을 것입니다. 이해하는 사람은 일반적으로 쉽게 쉽게입니다

Write code that is easy to understand.

코드 :; 관리합니다 귀하의 PC)

3

글쎄, 당신은 말했다

return i+=2, i-2; 

을 다만이 간단한 격언을 따를 수 컴파일러가 이해할 수 있고 따라서 컴파일러는이를 최적화 할 수 있습니다.

코드를 최적화하기 위해 미친 내용을 쓰는 것은 종종 컴파일러를 혼란스럽게 만들고 컴파일러가 코드를 최적화하는 것을 어렵게 만듭니다.

class Fkt 
{ 
    int num; 
public: 
    Fkt(int i) :num(i-2) {} 
    operator()() { num+=2; return num; } 
} 

int main() 
{ 
    Fkt fkt(5); 
    printf("%d ", fkt()); 
    printf("%d ", fkt()); 
    printf("%d ", fkt()); 
} 
+1

이 두 어셈블리의 차이점은 중요하지 않으며 두 번째 것은 읽을 때 훨씬 더 멋지다. –

+0

+1은 간단한 맥심을 위해 "이해하기 쉬운 코드를 작성하십시오." –

+0

두 번째 예제는 C++에서만 작동합니다 (또는 적어도 GCC는 '&'token '앞에'error : expected ';', ','또는 ')를 사용합니다). 표준 C에서 작동하는만큼이나 좋은가? – user966939

1

를 추천 할 것입니다 나는 당신이 정말로 원하는 것은 펑터라고 생각합니다.

편집 : 죄송합니다. 5,7,9을 달성하고 싶지 않습니다. 접두어 표기법을 사용할 수 없도록 임시 변수가 필요합니다.

-1

무엇 임시 변수없이 +2 씩 증가

int a = 0; 
++++a; 

에 대한 :

내가

int fkt(int &i) 
{ 
    int orig = i; 
    i += 2; 
    return orig; 
} 
+2

'++++ a;'는 불법입니다. 시퀀스 포인트간에 변수를 두 번 수정할 수 없습니다. –

+0

컴파일 오류가 발생한다는 의미입니까? 왜냐하면 나는하지 않습니다. 어쨌든 ++ (++ i)를하는 것이 불법 인 이유는 모르겠다. 변수를 늘리기 전에 변수를 늘리는 것이 합법적 인 것 같습니다. 하지만 내가 어쨌든 내가 잘못한 것 같아요. 명확화를 기다리는 중 :) – AkiRoss

+0

좋아, 나는 그것을 얻은 것 같아 : 접두사 증가가 시퀀스 포인트를 정의했다고 생각하지만 그렇지 않은 것 같습니다. 그래서, ++ a + ++ b도 불법입니까? 내가 읽었을 때 + 연산자는 하나를 정의하지 않습니다. – AkiRoss

관련 문제