代码之家  ›  专栏  ›  技术社区  ›  Manuel

有没有什么原因可以解释为什么StringPiece/StringRef习语不那么流行?

  •  12
  • Manuel  · 技术社区  · 14 年前

    StringPiece class in Chromium's source code :

    // A string-like object that points to a sized piece of memory.
    //
    // Functions or methods may use const StringPiece& parameters to accept either
    // a "const char*" or a "string" value that will be implicitly converted to
    // a StringPiece.  
    //
    // Systematic usage of StringPiece is encouraged as it will reduce unnecessary
    // conversions from "const char*" to "string" and back again.
    

    使用实例:

    void foo(StringPiece const & str) // Pass by ref. is probably not needed
    {
       // str has same interface of const std::string
    }
    
    int main()
    {
        string bar("bar");
        foo(bar); // OK, no mem. alloc.
    
        // No mem. alloc. either, would be if arg. of "foo" was std::string
        foo("baz");  
    }
    

    这似乎是一个非常重要和明显的优化,我无法理解为什么它没有更广泛的应用,以及为什么类似于StringPiece的类还没有出现在标准中。

    我有什么理由不应该代替 string char* 我自己的代码中的这个类的参数?在C++标准库中是否已经有类似的内容了?

    更新 . 我已经知道LLVM的源代码使用了类似的概念: StringRef 班级。

    6 回复  |  直到 8 年前
        1
  •  -7
  •   Stack Overflow is garbage    14 年前

    因为为什么要麻烦?使用复制省略和/或传递引用,为 std::string 通常也可以避免。

    C++中的字符串情况已经足够混乱,没有添加更多的字符串类。

    如果要从头开始重新设计语言,或者如果向后兼容性不是问题,那么这是可以在C++中进行字符串处理的许多可能的改进之一。但是现在我们两个都被卡住了 char* STD::字符串 将StringRef样式类添加到组合中会导致大量混乱,但好处有限。

    除此之外,使用一对迭代器是否可以更习惯地实现相同的效果? 如果我想传递一个字符序列,不管它们是属于字符串还是 字符* ,为什么不使用一对迭代器来分隔它们?

        2
  •  8
  •   Nick    8 年前

    稍晚一点,但是…

    弦乐背后的想法很好。该类可以捕获 std::string const char * 把它们传递给一个函数。下面是一个例子:

    void process(const StringRef s){
       // do something
    }
    
    process("Hello"); // const char *
    std::string s = "Hello";
    process(s); // std::string
    process(std::string("Hello")); // std::string rvalue
    

    如果接受功能 STD::字符串 如果传递 常量字符* 并复制整个字符(例如 memcpy )

    你也不需要担心生活时间,因为你已经过去了 StringRef 功能/方法。

    这类课程包括:

    • 谷歌-弦乐

    • boost-boost::字符串参考

    • LLVM-字符串引用

    我自己的(不完整的)实现可以在这里看到:
    https://github.com/nmmmnu/HM3/blob/master/include/stringref.h

    更新2016:

    在C++ 17中,有 std::string_view . 我没有详细研究它,但总的来说,它有同样的想法。也类似于它的矿山实施 constexpr c-tor,这样您就可以在编译时创建对象并与其他对象一起使用 常量表达式 功能。

        3
  •  4
  •   Tim Pierce    11 年前

    这个问题已经得到了很好的回答,但为了提供更多的上下文,我们需要 StringPiece 模式在谷歌内部得到了广泛的应用,并且已经有很多年了。在谷歌的编码指南中,强烈推荐使用它,这几乎可以肯定为什么Chrome(以及后来的Chromium)采用了它。

        4
  •  2
  •   Mark Ransom    14 年前

    StringPiece 保留一个指向传递给其构造函数的字符串数据的指针。因此,它依赖于弦的寿命比弦乐长。如果将StringPiece用作函数参数,则可以保证这一点;例如,如果将字符串的副本保存在类成员中,则不能保证这一点。

    它不像std::string那样通用,而且绝对不是它的替代品。

        5
  •  0
  •   Kornel Kisielewicz    14 年前

    标准正试图从const char*转向字符串,因此添加更多转换选项是无用的。

    还要注意,一个格式良好的程序应该使用string或const char*all-around;)。

        6
  •  0
  •   vharron    10 年前

    弦乐是伟大的,但作品不是以空结尾。如果需要传递到采用以空结尾的字符串的低级接口,则需要将字符串复制到以空结尾的字符串中。

    (并非所有人都购买了STL或Std::String。)