问题
我发现c_str
的std::basic_string
成员函数很丑陋,但同时我不希望创建大量临时std::basic_string
会对性能造成影响。
例
例如,给定这些功能签名:
void foo(const char* s);
void bar(const std::string& s);
显式调用c_str
如果我有
std::string
,则必须在调用站点上显式调用c_str
成员函数才能调用foo
,这有点难看。std::string s = "...";
foo(s.c_str()); // Yuck! Ugly!
创建临时
但是,如果我已经有了
const char*
,则编译器需要创建一个临时的std::string
才能调用bar
,这可能会影响性能。const char* s = "...";
bar(s); // Yuck! Potentially a performance hit!
重载
另一方面,我可以为这两者提供重载,并将结果从一个转发到另一个,但是懒惰的我不想编写超出需要的代码。
void baz(const char* s);
// Yuck! Carpal tunnel syndrome imminent.
inline void baz(const std::string& s)
{
baz(s.c_str());
}
要求
所以我认为有一个更好的选择:
可能的选择
我以为
boost::string_ref
可以在这里为我提供帮助,但是它缺少转换为const char*
的廉价方法。解
因此,我想创建一个新类来帮助我实现这一目标,就像这样:
class c_str
{
public:
c_str(const char* s)
: s(s)
{
}
c_str(const std::string& s)
: s(s.c_str())
{
}
operator const char*() const
{
return s;
}
private:
const char* s;
};
void qux(const c_str& s)
{
std::string s1 = s;
const char* s2 = s;
std::cout << s;
}
用法
foo("s1");
const char* s2 = "s2";
foo(s2);
const std::string s3 = "s3";
foo(s3);
foo(std::string("s4"));
是否已经存在类似的类(class)?还是有更好的选择?
编辑:如果有许多类似字符串的参数,问题会迅速升级。在我的示例中,只有一个,但是可以很多。
最佳答案
不要低估现代编译器的功能。
在考虑像这样优化代码之前,请务必进行概要分析。
IMO,最好在编写优化的代码之前先编写干净,可维护和安全的代码,方法是尝试比库更“智能”。
并且如果必须优化字符串(char *或std::string)操作,因为它是应用程序使用字符串(大字符串数据集)的目标,也许您需要查找其他类型的容器(和/或字符串池,...)供您特定使用。
关于c++ - 减少 “const char*”和 “const std::string&”参数的重载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23386685/