: <PRE>안녕하세요.
:
: 프로그래밍하다 보면 2개의 값을 바꾸는 SWAP 함수가 많이 필요하게 되죠.
: 이렇게 간단한건 함수로 구현하기 보다는 매크로로 사용하는 것이 속도면
에서
: 아무래도 유리합니다.
:
: 다음은 XOR을 이용한 SWAP 매크로 구현입니다.
:
: #define SWAP(a, b) ((a)^=(b)^=(a)^=(b))
누군가가 접속한 게시판의 글을 지나가는 길에 우연히 읽고 적습니다.
bitwise XOR 연산을 이용한 swap 매크로는 오래된 trick 입니다. 이
매크로는 많은 "이식성없는" 행동에 의존하고 있습니다 - 일단, a, b
의 type 에 크게 의존합니다 - a, b 의 type 이 다르거나 signed 정수
형일 경우 행동은 전혀 이식성을 갖지 못합니다.
더군다나 위의 수식은 두개의 sequence point 사이에서 한 대상체의 값
을 두번이상 수정하므로 표준 (C90, C99) 에 따르면 undefined
behavior 입니다 - 보통 위의 trick 은 하나의 수식으로 합쳐진 형태
보다는 각 대입마다 쉼표 연산자를 두어 sequence point 를 명확히 합
니다 - 그래도 이식성이 없음에는 차이가 없지요.
더군다나 a, b 가 같은 대상체일 경우 (즉, SWAP(a, a)) 에는 올바른
결과를 보이지도 않습니다.
위의 다양한 "이식성 없는" 사항들이 보장되고, 약 1억번의 루프안에서
몇십번씩 swap 이 실행된다면 써볼만한 trick 이겠지만, 저같으면 제
프로그램의 이식성을 떨어뜨리느니, 지극히 정상적인 방식의 swap 함수
를 inline 함수로 작성하여 사용하겠습니다 - 몇몇 똑똑한 컴파일러는
정상적인 swap 이 보이면 적절한 레지스터 최적화로 좋은 성능을 보여
주기도 합니다.
그럼...--Jun Woong (mycoboco at hanmail.net)
Dept. of Physics, Univ. of Seoul
Cell:+82 16 467 6247
Web : http://c-expert.uos.ac.kr