hirthwork 18.05.2012 05:31 mcabberA3392E87

if (pred()) {
return a;
}
return b;

vs.

if (pred()) {
return a;
} else {
return b;
}

?

Recommended by:

@dorfe: r = pred() ? a : b; goto end; /* ... */ end: return r;

1. psymatic 18.05.2012 05:32 Работа

pred()?a:b;

2. hirthworkpsymatic /1 18.05.2012 05:33 mcabberA3392E87

не работает если b не приводимо к a

3. Rayslava 18.05.2012 05:45 work.ab8e5521

if (pred()) return a;
return b;

4. hirthworkRayslava /3 18.05.2012 05:46 mcabberA3392E87

питонист дохуя?

5. Rayslavahirthwork /4 18.05.2012 06:02 work.ab8e5521

Перлоёб. А причём тут это?

6. magog 18.05.2012 06:09 Azoth@Work

я первый вариант использую.

8. DZhon 18.05.2012 06:46

Первый, конечно. И ворнинга не будет от особо въедливых концпеляторов.

10. kbhirthwork /4 18.05.2012 09:24

у питонистов за токое варнинг получишь

11. kbkb /10 18.05.2012 09:25

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

12. hirthworkkb /11 18.05.2012 09:26 mcabberA3392E87

смеялись много те, кто не знает что такое RVO

13. kbhirthwork /12 18.05.2012 09:42

Как вообще количество return'ов влияет на наличие/отсутствие RVO?

14. hirthworkkb /13 18.05.2012 09:43 mcabberA3392E87

напрямую. один return — может быть RVO, else — не может.

15. kbhirthwork /14 18.05.2012 09:52

но почему не может? не вижу причин.

16. hirthworkkb /15 18.05.2012 09:55 mcabberA3392E87

my_class f(bool b) {my_class c; if(b){return my_class();} else {return c;} } ← как здесь в момент компиляции вычислить какой из двух объектов нужно конструировать на месте объекта, которому происходит присваивание?

17. kbhirthwork /16 18.05.2012 09:59

а не надо во время компиляции ничего конструировать. каждый return получит свой RVO. первый будет создавать дополнительный объект, а второй не будет (т.к. этот объект будет конструироваться всегда). ведь RVO заключается в том, что при возвращении они не обязаны копироваться, так? тогда не вижу проблем.

18. hirthworkkb /17 18.05.2012 10:02 mcabberA3392E87

а теперь расскажи, как это объекты не будут копироваться, если у тебя в функции могут конструироваться два объекта, и при этом только один должен быть возвращён?

19. kbhirthwork /18 18.05.2012 10:14

я думал будет что-то вроде http://paste.ubuntu.com/993930/

20. kbkb /19 18.05.2012 10:15

ну, или даже проще. суть ясна. оптимизация в том, чтоб во время return устанавливать значение в указатель из параметра.

21. hirthworkkb /19 18.05.2012 10:28 mcabberA3392E87

т.е. в строках 16 и 19 у тебя не копирование?

22. kbhirthwork /21 18.05.2012 11:28

короче вот, наверное, ближе к тому, как я себе представлял RVO http://paste.ubuntu.com/994024/

f1 — это функция, которую должен оптимизировать компилятор. f2 — то, как я себе представлял, что он это сделает. таки да, в первом случае одно копирование имеет место быть, во втором — ни одного. если я мудак и это вообще бред — прошу объяснить.

23. hirthworkkb /22 18.05.2012 11:35 mcabberA3392E87

что тебе объяснить? что ты мудак? это следует из того что поведение компилятора отличается в лучшую сторону от того что ты от него ожидал. ну и из того что ты два copy c'tor'а написал

24. kbhirthwork /23 18.05.2012 11:39

не понял. а почему в лучшую когда как раз в худшую от того, что я от него ожидал?

25. hirthworkkb /24 18.05.2012 11:43 mcabberA3392E87

потому что твоё трактование не предусматривает возврат стэк-поинтера к исходному состоянию после выхода из функции

26. kbhirthwork /25 18.05.2012 11:54

еще раз. ты считаешь, что здесь отсутствует RVO? http://paste.ubuntu.com/994058/

27. 0xd34df00d 18.05.2012 12:07 Azoth_primary

1.

28. hirthworkkb /26 18.05.2012 12:14 mcabberA3392E87

ты считаешь этот код эквивалентным исходному?

29. 0xd34df00dkb /26 18.05.2012 12:19 Azoth_primary

В моих экспериментах RVO умирало при наличии более одного return'а. Даже в коде вида
Foo foo;
if (shit)
return foo;
foo.doSmth ();
return foo;

30. 0xd34df00dkb /13 18.05.2012 12:21 Azoth_primary

Сносит компилеру башню.

31. 0xd34df00dkb /15 18.05.2012 12:21 Azoth_primary

Значит, ты не понимаешь, как работает (N)RVO.

32. kbhirthwork /28 18.05.2012 12:23

ну короче хоть мне и непонятно еще почему именно невозможно оптимизировать иначе, но я понял, что при NRVO нужно как минимум возвращать "the same named object". про этом это не исключает возможность использоваться много return'ов, при этом имея RVO ни разу.

33. kbhirthwork /28 18.05.2012 12:24

зачем мне его считать эквивалентным исходному? в нём есть много ретурнов, RVO, и отсутствуют причины посмеяться.

34. kbkb /32 18.05.2012 12:35

про невозможность оптимизации NRVO при разных named object'ах теперь мне понятно (хотя если эти named object'ы используются в непересекающихся ветвях возврата, то вполне можно было бы и оптимизировать, просто видимо сложно дохуя)

Do you really want to delete ?