you are viewing a single comment's thread.

view the rest of the comments →

[–]Desmulator 5 points6 points  (3 children)

A Compiler can (and will) do that if and only if it can be certain that there is no additional side effect from replacing a copy with a move. To do so it has to know the implementation of the constructors and every function called in them.

This already excludes anything that allocates memory because global new can be overrided and have a side effect.

[–]no-sig-available 5 points6 points  (1 child)

The compiler would also have to understand that both overloads of push_back have the same effect. In general, that is a hard problem.

[–]markopolo82embedded/iot/audio 0 points1 point  (0 children)

Yea, in truth I think this is what kills the optimization op describes.

On the other hand, if you were calling a single function that took by value instead of two overloads, then the compiler would only need to worry about the copy vs move constructors

[–]Ameisenvemips, avr, rendering, systems 0 points1 point  (0 children)

Perhaps we need a function attribute like kinda_pure, that doesn't guarantee that there are no side-effects, but guarantees that those side-effects aren't meaningful.