【发布时间】:2015-02-19 05:35:52
【问题描述】:
我有这样的功能:
void init_str(std::string _s)
{
std::string s{_s};
}
我想通过允许const char* 重载来进行优化,以避免创建临时std::string。
void init_str(const char* c)
{
std::string s{c};
}
但我也可以使用转发。
template<typename T>
void init_str(T&& t)
{
std::string s{std::forward<T>(t)};
}
但是编译器对重载的偏好是:
const char*- 转发
std::string
那么我应该更喜欢哪种重载组合呢?
【问题讨论】:
-
应该没有显着差异。如果您对这些事情有疑问,请测量。
-
无论如何,该功能将被完全优化。真正的答案将取决于真正的功能。
-
我会按照@πάνταῥεῖ 所说的话。
std::string_view(TS) 也可能是一个很好的解决方案(矫枉过正?) -
您的第一个示例通过副本接受字符串,然后您制作另一个副本,表明您需要两个副本。但是您的
const char*示例只给您留下一个字符串。如果您真的只需要一个字符串,那么您的第一个示例不需要将参数复制到第二个字符串。此外,它的构造函数应该根据传入的内容做出最佳选择,因为它具有移动语义。如果你只想要一个字符串,你可能没有比这更好的了。只需复制接受参数,不要重新复制。 -
T&& t将根据作为其参数传递的原始字符串文字的长度创建一个单独的函数模板特化,除非您有const char* c重载
标签: c++ string performance c++11