2009-04-04 7 views
2

세 번째 변수를 사용하지 않고 두 변수를 스왑하는 동안 오버플로가 발생하는 경우 어떻게 처리 할 수 ​​있습니까? 나는 XOR 솔루션이 정수에만 사용될 수 있다고 믿는다. 다른 변수 유형은 어떻습니까?스왑 중 스택 오버플로

+0

다른 유형은 ..? 무슨 언어, btw? – Aziz

+0

그냥 직감이 ... 복사 생성자에서 스왑이 일어나는 C++이 아니겠습니까? –

답변

2

XOR은 XOR 연산자를 처리 할 수있는 모든 작업에 사용할 수 있습니다. 이진 데이터의 속성이지 정수를 나타내는 데 사용되는 이진 데이터가 아닙니다.

+0

XOR 연산자가 실제로 XOR 연산을 수행하는 경우에만, 연산자 오버로드를 허용하는 언어로 이상한 작업을 수행하기 위해 오버로드 된 경우가 아닙니다. –

+0

어; 예, 그건 사실이고, 언급할만한 가치가 있습니다. 감사. – chaos

+0

그래서 데이터를 정수 또는 문자 배열로 다시 캐스팅하고 그 요소에 대해 xor를 수행합니다. – paxdiablo

4

이것은 답변이 아니지만 의견에 맞지 않습니다.

스왑의 임시 변수를 추가로 사용하면 어려움을 겪을 수있는 사용 가능한 스택 저장소의 가장자리 가까이에서 어떤 상황에서 실행하고 있습니까?

일부 임베디드 시나리오를 볼 수는 있지만 어셈블리 언어로 코드를 작성하지 않는 경우 스택 공간에 너무 빡빡한 시나리오를 상상하기가 어렵습니다.

0

XOR 솔루션은 정수가 아닌 비트 단위로 복사 할 수있는 모든 유형에서 작동합니다. 그러나 변수 자체를 XOR하지 마십시오. 즉,

int x = 10; 
int *p1 = &x; 
int *p2 = p1; 

*p1 = *p1^*p2; 
*p2 = *p1^*p2; 
*p1 = *p1^*p2; 

/* now x == 0 :(*/ 
2

전혀 수행하지 마십시오. XOR 스왑 알고리즘은 멋진 해킹입니다. 생산 코드에서 shouldn't be used.

0

XCHG의 문제점은 무엇입니까? 스택 필요 없음, 오버 플로우 없음 (캐리 플래그)? 둘 중 하나를 설정하십시오.

+1

이 답변의 링크를 읽고 각주 2에 따라 읽고 읽으십시오. 요약하면 CPU 캐시가 엉망이되어 속도가 느려집니다. http://stackoverflow.com/questions/717935/stest-overflow-during-swap/717984#717984 –

+0

OOps, 나는 클릭 할 때 더주의해야한다. 즐거운 포인트;) XCHG에 대한 인텔 지침 매뉴얼을 다시 읽었으며 주어진 피연산자에 대한 자연스러운 정렬 액세스에 대해서만 캐시 페널티를 알았습니다. 어쩌면 내가 뭔가 빠졌어하지만 당신은 C/C++에서 64 비트 MSVC를 제외하고 대부분의 경우 XCHG를 인라인 할 수 있으며 비 정수형의 사용을 포함하여 2 개의 변수를 스왑 할 때 스택을 사용하지 않는 문제를 해결한다고 생각합니다. . 또한 다른 사람들이 물어 보았 듯이이 질문은 실제 언어와 관련이없는 것 같아서 어셈블리는 A-OK IMHO입니다. – RandomNickName42

0
a = a + b; 
b = a - b; 
a = a - b; 

정수 및 부동 소수점에 대해 작동합니다.

+0

이 답변의 링크를 읽고 각주 2를 읽고 그 내용을 읽으십시오. 즉, 간단한 스왑보다 많은 메모리와 CPU 사이클이 필요합니다. http://stackoverflow.com/questions/717935/stack-overflow-during-swap/717984#717984 –