Chipmunk
> А сложные проблемы все боятся обсуждать. Темы на три поста выходят.
+10308
Alex the..
> по моему невозможно это сделать в принципе
> вот возьми два десятилитровых ведра,
> в одно налито три литра воды, в другое два
> и путем переливания из одного в другое, добейся того чтоб лишний литр перешел
> туда где изначально было два литра
>
> если сравнишь их объемы, все равно ведь разницу нужно где то запомнить
> короче не обойтись без где то сохраняемых результатов элементарных действий
> благо есть компилятор который все прячет, либо команды процессора, которые тоже
> на самом деле высокоуровневые
не правильно надо рассматривать на литрами а плотностями.
в одному сосуде жидкость с плотность 4 в другом 5. и тд....
MATov
> std::swap(a,b);
Так делать не желательно. Как минимум возможная потеря производительности из-за std::. Это не шутка.
Из новостей C++1y:
a:=:b;
Swap operator C++ пока не приняли.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3746.pdf
But who cares?
//sarcasm x64 register int a, b, t; //... c=a; a=b; b=c;
c++11:
http://ideone.com/lItE1i
Можно и для большего количества аргументов
http://ideone.com/kTflBl
laMer007
А угадай какой выхлоп будет у этого:
А вот какой:
И не надо выёживаться с "супер оптимизациями", гробокопатели )
Hardcode
> Можно и для большего количества аргументов
Я вот тоже надеюсь, что больше свой свизлинг никто писать не будет.
MATov
> супер оптимизациями
Это банальная, но работающая оптимизация. Думаю не хочется получить 3 копирования для тяжелого объекта вместо их перемещения. Особенно до С++11.
И да
laMer007
> //sarcasm x64
есть сарказм помноженный.
laMer007
> Думаю не хочется получить 3 копирования для тяжелого объекта вместо их
> перемещения.
А какие проблемы с перемещением?
template<typename _Tp> inline void swap(_Tp& __a, _Tp& __b) #ifdef __GXX_EXPERIMENTAL_CXX0X__ noexcept( __and_<is_nothrow_move_constructible<_Tp>, is_nothrow_move_assignable<_Tp>>::value) #endif { // concept requirements __glibcxx_function_requires( _SGIAssignableConcept<_Tp>) _Tp __tmp = _GLIBCXX_MOVE( __a); __a = _GLIBCXX_MOVE( __b); __b = _GLIBCXX_MOVE( __tmp); }
laMer007
> Думаю не хочется получить 3 копирования для тяжелого объекта вместо их перемещения. Особенно до С++11.
дык std::swap под 11ыми плюсами будет пытаться переместить же ж.
Ну и естественно нужно понимать как будет работать swap когда его пишешь, и это ни чем не лучше: "t=a;a=b;b=t;", ибо одно и тоже (если без 11ых плюсов)
MATov
> swap ни чем не лучше: "t=a;a=b;b=t;",
неа, в общем случае лучше, особенно до 11 стандарта.
Hardcode
> А какие проблемы с перемещением?
до 11 - большие, а что интересует то?
laMer007
> Думаю не хочется получить 3 копирования для тяжелого объекта вместо их
> перемещения.
Так чем swap не устраивает, если в с++11 он делает перемещение, а в 03 все равно перемещения нет?
laMer007
> неа, в общем случае лучше, особенно до 11 стандарта.
и чем же лучше "t=a;a=b;b=t;" чем swap ? до 11ого стандарта он делаешь тоже самое, в 11ом еще пытается перемещать к тому же.
Hardcode
> а в 03 все равно перемещения нет?
В swap то? Иной раз есть "перемещение".
laMer007
> В swap то? Иной раз есть.
На уровне языка перемещения нет. Если уж написал для своего класса какой-нибудь костыль, эмулирующий перемещение, то можно написать и специализацию для swap.
MATov
> и чем же лучше "t=a;a=b;b=t;" чем swap ?
Отвечать на вопросы к чужим утверждениям я не вправе. Моё утверждение было в каком то смысле обратным.
Hardcode
> то можно написать и специализацию для swap.
Ну наконец то! Начинаете думать. Осталось пол пути. Интересно пройдёте за столько же постов что и первую половину? По идеи должно быть гораздо быстрее.
И тут мы возвращаемся к моему утверждению из-за которого возродились обсуждения:
laMer007
> > std::swap(a,b);
> Так делать не желательно. Как минимум возможная потеря производительности из-за
> std::
в общем случае.
Тема в архиве.