问题

我发现c_strstd::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/

    10-12 01:04
    查看更多