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 – 哪种重载组合效果最好?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)