c – 哪种重载组合效果最好?

c – 哪种重载组合效果最好?,第1张

概述我有这样的功能: 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(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

那么我更喜欢什么样的超载组合?

解决方法 假设c 11或更高,最高性能的解决方案是你尚未尝试过的解决方案:

voID init_str(std::string s){  // just use s}

因为复制省略将确保根本不构建不必要的临时.

这使用std :: string(const char *)构造函数构造s(总共1个构造):

init_str("xxx");

这构造了一个带有复制构造函数的s:

std::string x; // 1 constructorinit_str(x);   // 1 copy constructor

这用构造函数构造了s

std::string x;            // 1 constuctorinit_str(std::move(x));   // 1 move constructor

这根本不会创建临时的:

std::string get_str() {    std::string s("xxx");   // 1 constructor,but...    return s;               // ...because of RVO it's constructed at the call site}init_str(get_str());        // ... which is actually the constructor of s in init_str's arg List// ... total constructors: 1
总结

以上是内存溢出为你收集整理的c – 哪种重载组合效果最好?全部内容,希望文章能够帮你解决c – 哪种重载组合效果最好?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1216439.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存