잘 기억이 나지 않아 정확한지는 모르겠지만
((a)^=(b)^=(a)^=(b)) 의 경우
xor a,b
xor b,a
xor a,b
로 작동하겠지요
a ^= b는 a와 b의 xor을 a에 대입하는 것이 아닙니다.
그리고 만약 xor 명령어 자체가 메모리가 아닌 레지스터만으로 연산한다고
해도 (잘 기억이 안나서 정확히는 답변이 안되겠네요. 하지만 가물가물한 기
억으로는 dest 쪽만 레지스터이면 될껍니다)
mov eax, a
mov ebx, b
xor eax, ebx
xor ebx, eax
xor eax, ebx
요로코롬 되면 끝날겁니다.
((c)=(b),(b)=(a),(a)=(c)) 의 경우
말씀하신데로 6번이 되겠네요.
mov 의 경우 둘중 하나면 레지스터이면 될테니... (아닌가??? 기억이 가물가
물... 어셈한지 한 7-8년 된듯한디 -.-)
mov eax, c
mov a, eax
mov eax, a
mov b, eax
mov eax, b
mov c, eax
아 위의 코드들은 대충 의사코드임다.
정확한 자료가 아니라 -.-;;
님께서 말씀하신데로 컴파일러에 따라 많은 차이가 있겠네요 ^^
근데 위의 xor 방식은 예전부터 속도를 위해서 많이 쓰던 방식이라 괘않은
컴파일러라면 잘 찾아서 해줄듯 한디... 잘 모르겠네엽... ^^
아 그리고 정말 기억이 가물가물해서 맞는지도 잘 모르겠습니다만은... 어쨌
거나 xor이 mov보다는 명령 자체만으로도 속도가 더 빨랐던 것으로 기억납니
다.
그럼 즐프...
: ((a)^=(b)^=(a)^=(b)) 의 경우
: mov 연산 6번에 xor 연산 3번에 사용되고
: ((c)=(b),(b)=(a),(a)=(c)) 의 경우
: mov 연산 6번 만 하면 되는 걸로 기억되는데요..
: 맞는지 틀린지는 한번 확인해 봐야 되겠군요.
: 아.. 참.. 컴파일러 마다 조금씩은 틀리겠군요.
: 제가 말한 것은 바보같은 VC++의 얘기 입니다.
:
: : 매크로를 써서 속도를 높인다면
: : 님이 생각하신 방법보다는 원문의 XOR을 이용한 것이 더욱더 빠릅니다.
: : 대입의 경우 내부적으로 mov 명령어로 처리되며 XOR의경우는 xor로 처리
됩니다.
: : mov 명령어 보다 xor 명령어가 훨씬 빠릅니다.
: :
: : 그럼 즐프...
: :
: : : 음냐.. 컴파일 되겠죠? 잘 모르겠당... ^^;
: : : 어짜피 함수 호출하는 거는 시간 많이 걸리는 건 당연하고..
: : : 매크로를 써서 속도를 높일 거면 이 왕 하는 거 좀 더 빠르게..
: : : 요렇게 하면 연산 횟수가 9번에서 6번으로 줄 거 같은디...
: : :
: : : <pre>
: : : #include < stdio.h >
: : :
: : : //#define SWAP(a, b) ((a)^=(b)^=(a)^=(b))
: : : #define SWAP(a, b) ((c)=(b),(b)=(a),(a)=(c))
: : : int c;
: : :
: : : int main(void) {
: : : int a = 22;
: : : int b = 44;
: : :
: : : SWAP(a, b);
: : :
: : : printf("a = %d, b = %d", a, b);
: : :
: : : return 0;
: : : }
: : : </pre>
:
: --
: -----