gpt4 book ai didi

c++ - 为什么这段代码对 char * 很快?

转载 作者:可可西里 更新时间:2023-11-01 16:36:49 26 4
gpt4 key购买 nike

this talk by Sutter在 1:15:26 出现了如下代码,

class employee{
std::string name_;

public:
template<class String, class=
std::enable_if_t< !std::is_same<std::decay_t<String>, std::string>::value > >
void set_name(String && name)
noexcept(std::isnothrow_assignable<std::string &, String>::value)
{
name_ = std::forward<String>(name);
}
}

我知道 std::forward 是如何工作的,如果 name 是一个左值,name_ 将被复制构造;如果 name 是一个右值,name_ 将被构建。但是在幻灯片中它还说 Optimized to steal from rvalues (and more),还有什么?

后来它显示这段代码似乎是所有四个实现中最快的,尤其是对于char *,任何人都有耐心浏览这段代码并解释还优化了什么以及为什么它是最快的,特别是在 char * 的情况下?

最佳答案

首先,请注意该代码包含一个拼写错误,并且即使删除了拼写错误,enable_if 约束也不会执行所讨论的内容;特别是该函数不能与 char* 一起使用,因此显然它不是 char* 上最快的。你可以看到我问的一个问题 here连同“更正”的完美转发 setter (以及 Howard Hinnant 对此版本的认可)。

template <class String>
auto set_name(String&& name)
-> decltype(name_ = std::forward<String>(name), void()) {
name_ = std::forward<String>(name);
}

用于演示文稿的基准是在 employee 上重复调用 set_name 以显示成员 string 到达的情况重用其容量,而不是每次迭代都分配内存。基准测试中显示的高条和短条之间的区别是重用容量与每次迭代进行分配之间的区别。

正确的完美转发器使用 char* 速度很快的原因是因为 char* 模板的实例化只是转发了一个 char*而不是需要构造一个 string 参数来调用 set_name 一个实际的 string 对象参数。 setter 内部的赋值速度很快,因为 string 实现了 operator=(char*),它将高效的 memcpy 到其现有存储中,并且避免了额外的分配。

所以声明Optimized to steal from rvalues (and more)是因为完美转发除了转发之外什么都不做。它不仅在获得右值时传递右值,而且它也不转换类型,这意味着优化“forwardee”实现,例如 stringoperator=(char *) 也暴露出来。

关于c++ - 为什么这段代码对 char * 很快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32216627/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com