Переполнение стека во время SWAP

Как мы можем позаботиться о переполнении, происходящем при замене двух переменных, без использования третьей переменной. Я считаю, что решение XOR можно использовать только для целых чисел. а как насчет других типов переменных?


person Community    schedule 04.04.2009    source источник
comment
другие типы, такие как ..? какой язык, кстати?   -  person Aziz    schedule 05.04.2009
comment
Просто догадка... это не будет C++ с обменом, происходящим в конструкторе копирования, не так ли?   -  person Vilx-    schedule 05.04.2009


Ответы (6)


Это не ответ, но он не подходит для комментария.

При каких обстоятельствах вы будете работать так близко к краю доступного хранилища стека, что дополнительное использование временной переменной для свопа вызовет у вас трудности?

Я мог видеть некоторые встроенные сценарии, но мне трудно представить сценарий, в котором у вас было бы так мало места в стеке, что это имело бы значение (когда вы не пишете код на языке ассемблера).

person ReinstateMonica Larry Osterman    schedule 04.04.2009

XOR будет работать для всего, что вы можете заставить обработать свой оператор XOR; это свойство двоичных данных, а не двоичных данных, используемых для представления целых чисел.

person chaos    schedule 04.04.2009
comment
Только если оператор XOR фактически выполняет операцию XOR, а не если он был перегружен, чтобы делать что-то странное (то есть на языке, который допускает перегрузку оператора). - person David Z; 05.04.2009
comment
Фу; да, это правда, и стоит упомянуть. Спасибо. - person chaos; 05.04.2009
comment
Итак, верните данные обратно в целочисленный или символьный массив и выполните операцию xor над его элементами. - person paxdiablo; 05.04.2009

Не делая этого вообще. Алгоритм обмена XOR — классный хак. Его не следует использовать в рабочем коде.

person sigjuice    schedule 04.04.2009

Решение XOR работает с любым типом, который можно копировать побитно, а не только с целыми числами. Однако не выполняйте XOR переменной с самой собой: т.е.

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

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

/* now x == 0 :( */
person rlbond    schedule 04.04.2009

Что не так с XCHG? Стек не нужен, нет переполнения (флаг переноса)? ставь либо :).

person RandomNickName42    schedule 02.07.2009
comment
Прочтите ссылку в этом ответе, а затем перейдите к сноске 2 и прочитайте ее. Короче говоря, он портит кеш процессора, тем самым замедляя работу. stackoverflow.com/questions/717935/stack-overflow- во время замены/ - person Vilx-; 02.07.2009
comment
Упс, мне следует быть осторожнее с моим кликом, я на самом деле не хотел голосовать за этот комментарий, но наслаждаюсь моментом;) Я перечитал руководство по эксплуатации Intel для XCHG и заметил штраф за кеширование только при неестественном выравнивании. доступ к заданным операндам. Может быть, я что-то упускаю, но вы можете встроить XCHG в C/C++ по большей части, сохранить 64-битный MSVC, и я думаю, что это решает вопрос о том, чтобы не использовать стек при замене 2 переменных, включая использование нецелочисленных типов . Кроме того, как спрашивали другие, этот вопрос на самом деле даже не кажется специфичным для языка, поэтому ИМХО сборка A-OK :) - person RandomNickName42; 02.07.2009

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

Это будет работать для целых чисел и чисел с плавающей запятой.

person tefozi    schedule 02.07.2009
comment
Прочтите ссылку в этом ответе, а затем перейдите к сноске 2 и прочитайте ее. Короче говоря, это занимает больше памяти и циклов процессора, чем простой своп. stackoverflow.com/questions/717935/stack-overflow- во время замены/ - person Vilx-; 02.07.2009