세 번째 변수를 사용하지 않고 두 변수를 스왑하는 동안 오버플로가 발생하는 경우 어떻게 처리 할 수 있습니까? 나는 XOR 솔루션이 정수에만 사용될 수 있다고 믿는다. 다른 변수 유형은 어떻습니까?스왑 중 스택 오버플로
답변
이것은 답변이 아니지만 의견에 맞지 않습니다.
스왑의 임시 변수를 추가로 사용하면 어려움을 겪을 수있는 사용 가능한 스택 저장소의 가장자리 가까이에서 어떤 상황에서 실행하고 있습니까?
일부 임베디드 시나리오를 볼 수는 있지만 어셈블리 언어로 코드를 작성하지 않는 경우 스택 공간에 너무 빡빡한 시나리오를 상상하기가 어렵습니다.
XOR 솔루션은 정수가 아닌 비트 단위로 복사 할 수있는 모든 유형에서 작동합니다. 그러나 변수 자체를 XOR하지 마십시오. 즉,
int x = 10;
int *p1 = &x;
int *p2 = p1;
*p1 = *p1^*p2;
*p2 = *p1^*p2;
*p1 = *p1^*p2;
/* now x == 0 :(*/
전혀 수행하지 마십시오. XOR 스왑 알고리즘은 멋진 해킹입니다. 생산 코드에서 shouldn't be used.
XCHG의 문제점은 무엇입니까? 스택 필요 없음, 오버 플로우 없음 (캐리 플래그)? 둘 중 하나를 설정하십시오.
이 답변의 링크를 읽고 각주 2에 따라 읽고 읽으십시오. 요약하면 CPU 캐시가 엉망이되어 속도가 느려집니다. http://stackoverflow.com/questions/717935/stest-overflow-during-swap/717984#717984 –
OOps, 나는 클릭 할 때 더주의해야한다. 즐거운 포인트;) XCHG에 대한 인텔 지침 매뉴얼을 다시 읽었으며 주어진 피연산자에 대한 자연스러운 정렬 액세스에 대해서만 캐시 페널티를 알았습니다. 어쩌면 내가 뭔가 빠졌어하지만 당신은 C/C++에서 64 비트 MSVC를 제외하고 대부분의 경우 XCHG를 인라인 할 수 있으며 비 정수형의 사용을 포함하여 2 개의 변수를 스왑 할 때 스택을 사용하지 않는 문제를 해결한다고 생각합니다. . 또한 다른 사람들이 물어 보았 듯이이 질문은 실제 언어와 관련이없는 것 같아서 어셈블리는 A-OK IMHO입니다. – RandomNickName42
a = a + b;
b = a - b;
a = a - b;
정수 및 부동 소수점에 대해 작동합니다.
이 답변의 링크를 읽고 각주 2를 읽고 그 내용을 읽으십시오. 즉, 간단한 스왑보다 많은 메모리와 CPU 사이클이 필요합니다. http://stackoverflow.com/questions/717935/stack-overflow-during-swap/717984#717984 –
- 1. 정렬 스택 오버플로 및 비교 수 및 스왑 수 음수
- 2. 스택 오버플로
- 3. XMLListCollection의 스택 오버플로 collectionEvent
- 4. C에서 포인터로 스택 오버플로
- 5. 스택 오버플로 메모리
- 6. 프로그램의 스택 오버플로 문제
- 7. 스택 오버플로 방법
- 8. 스택 오버플로 란 무엇입니까?
- 9. Fortran 프로그램의 스택 오버플로
- 10. 스택 오버플로/메모리 부족
- 11. 플래시 스택 오버플로 디버깅
- 12. Eclipse - 스택 오버플로 오류
- 13. 스택 오버플로 오류 android?
- 14. 꼬리 재귀 스택 오버플로
- 15. 스택 오버플로 오류 JQuery와
- 16. 오버로드시 오버플로 스택 오버플로 << 연산자
- 17. 스택 오버플로를 늘린 후 스택 오버플로
- 18. 복사 중 바이트 스왑
- 19. 스택 오버플로 읽기 RSS 피드
- 20. C# 스택 오버플로 예외가 발생했습니다.
- 21. QuickSort 및 스택 오버플로 예외
- 22. 프로그래밍 방식으로 스택 오버플로 인증
- 23. 일반 자바 스크립트에서 스택 오버플로
- 24. Internet Explorer의 "스택 오버플로 0"
- 25. 스택 오버플로 및 재귀 메서드
- 26. iphone의 presentModelViewController에 의한 스택 오버플로
- 27. 많은 LINQ 스택 오버플로 선택
- 28. Eclipse JSP 편집기에서 스택 오버플로
- 29. 디버깅은 종종 스택 오버플로 오류
- 30. VB6 정수로 변환하는 중 오버플로 오버플로
다른 유형은 ..? 무슨 언어, btw? – Aziz
그냥 직감이 ... 복사 생성자에서 스왑이 일어나는 C++이 아니겠습니까? –