2009-11-28 6 views
0

편집 : 두 번째 코드의 루프 부분을 추가하는 것을 잊었습니다. 두 코드 스타일while 루프에서 while 루프를 중첩하고 while 루프에서 if-else 루프를 중첩하는 것 사이에 중요한 차이가 있습니까? (C++)

while(some_loop_cont_val) 
{ 
    while(pre_x is not done) 
    { 
     //do action pre_x 
    } 
    //do action x 
} 

while(some_loop_cont_val) 
{ 
    if(pre_x is not done) 
    { 
     //do action pre_x 
    } 
    else 
    { 
     //do action x 
    } 
} 

제 루프 찾고

않는 pre_x (아마도 반복적 동작) 다음 X, 두번째는 pre_x의 일부이어서,하지 그것의 완료되지 않는 경우에, 그것을 할 때까지 그것을하는 것을 계속하는, 그 후에 x. 그래서 둘 다 pre_x와 x를합니다.

효율면에서나 다른면에서 차이가 있는지 궁금합니다 (예 : 드물게 발생하는 미묘한 효과가있는 경우 & c). 특정 상황에서 다른 것 대신 하나를 사용하는 이유이거나 단지 선호의 문제 일뿐입니다.

+9

루프가 정말 아닌 경우 - 다른 사람 ... – Lucas

+0

두 가지 예는 잠재적으로 할 수 pre_x, x 및 조건에 따라 다른 것들 ... – Thanatos

+1

달성하려는 것은 무엇입니까? – nothrow

답변

1
  1. break 외부 루프를 종료하는 구문을 사용하면 외부 루프를 종료 할 수 없습니다. 따라서 break/continue 문으로 소개 된 유용한 기능을 놓치게됩니다. 비교 : 1 반복에를 입력하고 두 번째에를 입력하지 :

    while(some_loop_cont_val) { 
        if(some_det) { 
         break; 
        } 
    } 
    //"break" takes you here 
    

    while(some_loop_cont_val){ 
        while(some_det) { 
         break; 
        } 
        //"break" takes you here 
    } 
    
  2. 또 다른 한가지는 루프가 필요합니다 "하면서"적어도 이 비교가 있다는 것입니다 .

4

첫 번째 예에서는 두 번째 while 루프가 실제로 반복 될 수 있습니다.

두 번째 예제는 두 개의 다른 동작을 조건부로 커밋합니다.

0

제발, 그러한 것들의 효율성에 대해 걱정하지 마십시오!

코드는 일 것입니다. 차이점을 눈치 채지 못할 정도로입니다.

그리고 거의 아무것도, 프로파일없는 경우이 시간은 그 루프의의 프로그램 카운터가 10 % 이상을 소비하는 것을 보여줍니다, 다음의 효율성에 대해 우려하고있다. 그런 다음 루프를 풀거나 다른 영리한 일을 할 수 있습니다.

-2

효율성과 선호도는 모두 임의이며, 두 코드 단편은 어떤 식으로도 동등하지 않습니다. if-else이 아니고 루프 구성입니다.

0

기억해야 할 중요한 점은 기계 코드 레벨은 여전히 ​​몇 가지 설명의 점프 문이된다는 것입니다. 당신이 성취 한 유일한 것은 그것이 설계 한 것 이외의 것을 위해 언어 기능을 사용하는 데있어서 두통 거리가되는 것입니다.

일부 저수준 프로그래밍 (드라이버 등)에서는이 최적화가 필요할 수도 있습니다. 그러나 나는 그것을 의심합니다.그런 수준에 도달하면 어셈블러에 물건을 쓰거나 매크로를 사용하여 모호성을 숨기는 것이 더 좋은 방법 일 수 있습니다.

0

로직을 동일하게 만들기 위해 코드를 적절하게 변경하면 CPU가 더 나은 분기 예측을 할 수 있기 때문에 하나의 루프를 사용하면 더 효과적입니다 (하나의 루프는 두 개보다 예측하기 쉽습니다. 예측이 방법으로) 분기 예측에

더 : http://en.wikipedia.org/wiki/Branch_predictor

0

첫 번째 스타일의 내부 루프 외부 루프의 조건이 거짓이되면 내부 루프의 조건이 참 남아있는 경우, 반복 할 것입니다.

대조적으로 if 브랜치는 if 조건이 true인지 여부에 관계없이 외부 루프의 조건이 false가되면 반복적으로 실행할 수 없습니다.

은 (그리고 다른 사람들이 말한 반복.. : 루프가 아닌 경우 - 다른 잠시처럼,이 제어 구조이지만, 루프 없음)

0

을 두의 논리는 입니다 전혀 다른입니다. some_loop_cont_val는 사실이고 조치는some_loop_cont_val 거짓, 만 첫 번째 예는 할 것 만드는 pre_x

경우 조치 X

관련 문제