【发布时间】:2014-03-03 13:21:01
【问题描述】:
如果我错了,请纠正我。说我有:
struct X
{
std::string mem_name;
X(std::string name)
: mem_name(std::move(name))
{}
...
};
struct Y
{
std::string mem_name;
Y(const std::string &name)
: mem_name(name)
{}
...
};
在X 的ctor 中,name 显然是传递给X 的任何参数的副本,X 调用std::string 的移动ctor 来初始化mem_name,对吗?
我们称之为在X*上复制然后移动;两个操作:复制、移动。
在Y 的ctor 中,name 是一个常量引用,这意味着没有元素的实际副本,因为我们直接处理从需要创建Y 对象的任何位置传递的参数.但随后我们复制了name 以在Y 中初始化mem_name;一次操作:复制。因此,它当然应该更快(并且对我来说更可取)?
在 Scott Meyer 的 GN13 演讲中(大约在 8:10 和 8:56 的时间范围内),他谈到了“想要速度?通过价值传递”,我想知道是否存在任何性能差异或通过引用传递参数(或准确地说是字符串)和按值传递“以提高速度?”
我知道按值传递参数可能会很昂贵,尤其是在处理大数据时。
也许(很明显?)我在他的演讲中遗漏了什么?
【问题讨论】:
-
听起来像是内存和 CPU 之间的经典权衡,但我看不出加速的地方。必须复制,这需要时间。但是您没有单独副本的线程争用问题。他是在异步任务的背景下说话吗>?
-
您可能还想阅读original article。顺便说一句,我对您的帖子进行了一些基本的格式改进,但您可能想花更多时间在格式和缩进上(在预览中验证它)。
-
@duffymo 这个想法是,有时,在按值获取时,可以通过直接就地构造来省略副本,但在使用 const ref 时这是不可能的。
-
要更好地解释传递值所带来的优化机会,请查看 Chandler Carruth 的出色 BoostCon 2013 keynote (youtube video)。