【发布时间】:2015-02-23 09:00:19
【问题描述】:
我曾经通过const & 或至少通过& 传递每个复杂结构。但是有了新的std::move 语义和编译器今天提供的所有优化,它仍然是选择吗?
考虑这样的例子:
struct Task{
unsigned timeMS;
void(*function)(unsigned, unsigned) = 0;
Task(unsigned timeMS, void(*function)(unsigned, unsigned))
: timeMS(timeMS), function(function){}
};
class Timeline{
std::vector<Task> 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); }
};
addTask1, addTask2, addTask3 中的哪一个是要走的路?假设App::addTask() 是一种被大量使用的方法。
我猜const & 需要创建一个副本,但我了解到事情并不像看起来那么简单。提及 RVO (http://en.wikipedia.org/wiki/Return_value_optimization) 就足够了 - 我确信还有更多的事情需要考虑(我还不知道)。
我知道inline 实际上只是对编译器的建议,而不是命令。但它会改变const & vs & vs by value 的战斗吗?
我正在使用 VC++ 2013,我不太关注 gcc。
附:请注意,App::addTask 调用 Timeline::add,后者调用 vector::push_back。所以参数传递不止一次 - 我是否应该将App::addTask 和Timeline::add 设为相同的“类型”(const & vs & vs by value)。
【问题讨论】:
-
Move 根本没有帮助,如果
const&或值在内联后编译成不同的东西,我会感到惊讶。 -
在类定义中定义的成员函数是隐式内联的
-
@Pradhan 这个问题正是关于
std::string,而不是关于用户定义的自定义结构。我不相信这是 1:1 的情况(例如,我猜std::string的复制构造函数成本是不同的)。 -
@PolGraphic 正如答案所解释的,如果您要复制参数,请按值传递。如果没有,请通过
const &。此外,如果您只是将其转发到其他地方,您可能需要研究完美的转发习惯。
标签: c++ c++11 pass-by-reference move-semantics