C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[24442] [심심풀이] Temp 변수 없이 변수 Swap 시키기...인뎅... (^^;)
candalgo, 광양 [kongbw] 8780 읽음    2014-02-03 18:37
며칠 전에 페북에서 "Temp 변수 없이 Swap을 하는 방법"에 대한 글을 봤었습니다.

프로그래밍 관련 입문서들을 보면 거의 빠짐 없이 나오는 내용이죠.  (^^)

보통은 Temp 변수를 하나 선언해서 Swap을 하는데 Temp 변수 없이 Swap을 시킨다니...
전에도 그런 방법이 있다는 건 들었는데
대충 봤었던 터라 흥미도 생기고 해서 찬찬히 읽어봤었습니다.

그렇게 어렵거나, 복잡한 내용은 아니더군요.  (^0^;)

http://www.thecrazyprogrammer.com/2014/02/how-to-swap-two-numbers-without-using-temporary-variable-or-arithmetic-operators.html

혹시나 해서
Temp 변수 없이 Swap을 하면 아~~~~~~~~~~~주 조금이라도
속도를 높일 수 있지 않을까해서 테스트를 해봤습니다.


Test 결과)

우리가 알고 있는 기존 방법이 약 5초 정도 걸린다면
Temp 변수없이 Swap 하는 방법은 약 7초 정도 걸림...   (-_-;;)


결론) Temp 변수 없이 Swap 하는 방법을 쓸 이유는 전혀 없음.


의의) 걍 상식차원에서 그런 방법도 있다더라!!! 라고 이해하자!   (^0^)/


혹시나 해서 컴파일 후 어셈으로 된 코드를 봤는데
Temp 변수를 써서 Swap을 하는 방법이 제일 단촐(?)하더군요.


Temp 변수 써서 Swap    --- mov 연산 10번

Temp 변수 안쓰고 Swap --- mov 연산 11번에
                                            add 연산 1번에
                                            sub 연산 2번

Temp 변수 안쓰고 Swap(2)
            xor 연산을 써서 --- mov연산 9번에
                                           xor 연산 3번


P.S. - 뒷북이라면 죄송~~~   m(_ _)m




김상구.패패루 [peperu]   2014-02-04 09:30 X
그 문서에 나온대로 사용하면 당연히 연산 횟수가 차이가 날꺼고... 이런식으로 하면 연산 수는 같아집니다.

#define swap(a,b)   (a)-=((b)=((a)+=(b))-(b))
#define swap_tmp(a,b,tmp)   tmp=b;b=a;a=tmp;
#define swap_xor(a,b) (a)^=((b)^=((a)^=(b)))

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int a = -100, b=30, tmp;

  swap(a,b);
  swap_tmp(a,b,tmp);
  swap_xor(a,b);

}
Unit1.cpp.24: swap(a,b);
00402EDE 8B45F0           mov eax,[ebp-$10]
00402EE1 0145F4           add [ebp-$0c],eax
00402EE4 8B55F4           mov edx,[ebp-$0c]
00402EE7 2B55F0           sub edx,[ebp-$10]
00402EEA 8955F0           mov [ebp-$10],edx
00402EED 2955F4           sub [ebp-$0c],edx
Unit1.cpp.25: swap_tmp(a,b,tmp);
00402EF0 8B45F0           mov eax,[ebp-$10]
00402EF3 8945EC           mov [ebp-$14],eax
00402EF6 8B4DF4           mov ecx,[ebp-$0c]
00402EF9 894DF0           mov [ebp-$10],ecx
00402EFC 8B45EC           mov eax,[ebp-$14]
00402EFF 8945F4           mov [ebp-$0c],eax
Unit1.cpp.26: swap_xor(a,b);
00402F02 8B55F0           mov edx,[ebp-$10]
00402F05 3155F4           xor [ebp-$0c],edx
00402F08 8B4DF4           mov ecx,[ebp-$0c]
00402F0B 314DF0           xor [ebp-$10],ecx
00402F0E 8B45F0           mov eax,[ebp-$10]
00402F11 3145F4           xor [ebp-$0c],eax
김상구.패패루 [peperu]   2014-02-04 09:33 X
사실 속도 차이가 나지 않는다고 해도 다른 문제를 고려할 필요가 있습니다.

1. float이나 double 형에는 사용할 수 없다는게 더 큰 문제.
+-연산만 사용하더라도 부동소수점 특성 상 값이 약간 달라지게 되고 xor은 아예 사용 불가

2. char와 같이 overflow가 일어날 가능성이 높은 타입에 대해서는 신중하게 접근할 필요가 있고(실제로 해 보면 별 문제는 없음. 수학적으로 증명할 필요는 있음. 당연히 xor방식은 overflow와 무관)
candalgo, 광양 [kongbw]   2014-02-04 09:43 X
오옷!!!  역시 상구 성님!!!   (^o^)=b
candalgo, 광양 [kongbw]   2014-02-04 09:46 X
근데 상구 성님!!!
혹시 mov, sum, sub, xor 각 연산들 있잖아요...
각자가 다 연산하는 속도는 같다고 볼 수 있나요?
아~~주 미묘하게 어떤 연산이 더 계산하는 속도가 빠르거나 느린게 있는지 궁금하내요...
(^0^)???

왠지 성님은 알고 계실거 같아서 여쭤봅니당~~
김상구.패패루 [peperu]   2014-02-04 10:00 X
아~~주 미묘한건 신경쓸 것 없고... 어차피 그정도 최적화를 요하는 문제라면 CPU별로 intrinsic명령을 지원하는 것도 있을테니 그런걸 쓰면 되겠지. ㅎㅎ
임베디드쪽에서는 거의 명령의 수, 사용중인 메모리(DDR, L2, L1) 종류에 따라 결판 나는 문제라 이렇게 register에서 거의 처리되는 경우라면 속도 차이는 거의 무시해도 무방하지 않을까?
김상구.패패루 [peperu]   2014-02-04 10:01 X
그런 부분 보다는 swap명령을 정의할 때 swap이라는 단어를 쓰지 않고 swap_int 와 같이 형을 명시적으로 표현해 줘서 다른 불상사가 생기지 않게 주의해 주는 것... 그게 더 중요하다고 생각해
김상구.패패루 [peperu]   2014-02-04 10:04 X
정 궁금하면 테스트 해서 올려봐바 ㅋㅋ 정확한 테스트를 하는 것 자체가 더 힘든 일이라 난 안할란다.
candalgo, 광양 [kongbw]   2014-02-04 10:25 X
덕분에 좋은거 배웠씀다.  (^0^)=b
Yull [huiso]   2014-02-04 10:38 X
좋은거 배운건가........??
candalgo, 광양 [kongbw]   2014-02-04 10:48 X
이런게 모이고 쌓여서 피가 되고 살이 되지 않을까.... 생각하옵니당~~  (^0^)
김태선 [cppbuilder]   2014-02-04 11:46 X
스택을 이용하면 더 쉬움
        push eax;
        mov eax, ebx;
        pop ebx;
간단히 스왑 !


김상구.패패루 [peperu]   2014-02-04 12:27 X
candalgo, 광양 [kongbw]   2014-02-04 17:28 X
To. 김태선님, To. 상구성님
: 덕분에 많이 배웁니다.  m(_ _)m

+ -

관련 글 리스트
24442 [심심풀이] Temp 변수 없이 변수 Swap 시키기...인뎅... (^^;) candalgo, 광양 8780 2014/02/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.