I used to pass
every complex structure by const &
or at least by
&
. But with the new std::move
semantic and all the optimizations that compilers offer today, is it still
the option to go?
Consider such
example:
struct
Task{
unsigned timeMS;
void(*function)(unsigned,
unsigned) = 0;
Task(unsigned timeMS, void(*function)(unsigned, unsigned))
: timeMS(timeMS),
function(function){}
};
class Timeline{
std::vector tasks;
...
};
class
App{
...
public:
inline void addTask1(const Task
&task){ timeline.add(Task); }
inline void addTask2(Task &task){
timeline.add(Task); }
inline void addTask3(Task task){ timeline.add(Task);
}
};
Which
one of addTask1, addTask2, addTask3
is the way to
go? Assume that App::addTask()
is an heavily
used method.
I guess that const
requires to create a copy, but I've learned that things are not as
&
simple as they look. It's enough to mention RVO ( href="http://en.wikipedia.org/wiki/Return_value_optimization"
rel="nofollow">http://en.wikipedia.org/wiki/Return_value_optimization) -
and I'm sure that there are much more things that should be taken into account (and I'm
not aware of them yet).
I know that
inline
is in fact just the suggestion for compiler, rather then
an order. But does it change anything in const &
vs
&
vs by value
battle?
I am working with VC++ 2013, I'm not
focused on gcc too much.
P.s. Note that
App::addTask
call Timeline::add
which
call vector::push_back
. So the parameter is
passed more then once - should I make both
App::addTask
and Timeline::add
of the
same "type" (const &
vs &
vs
by value
).
No comments:
Post a Comment