【问题标题】:Passing C++ strings by value or by reference按值或按引用传递 C++ 字符串
【发布时间】:2009-12-11 04:29:29
【问题描述】:

我想知道 C++ 字符串是否被认为足够小,以便在按值传递时比通过引用更有效。

【问题讨论】:

标签: c++ string


【解决方案1】:

没有。通过引用传递它:

void foo(const std::string& pString);

一般来说,如果事物具有非平凡的复制构造函数,则按引用传递,否则按值传递。

字符串通常由一个指向数据的指针和一个长度计数器组成。它可能包含更多或更少,因为它是定义的实现,但您的实现不太可能只使用一个指针。

在模板代码中,你也可以使用const T&,因为编译器可以使用函数的定义。这意味着它可以决定是否应该为您提供参考。 (我认为)

【讨论】:

  • 您的启发式方法不适用于doublelong double(通常最好按值传递)。同样,对于单参数函数,通常最好按值传递 2 个机器字 UDT,因为寄存器将用于存储这两个部分(并节省额外的间接寻址)。
  • 此外,sizeof(T) 通常是一个非常糟糕的衡量标准,因为它不能衡量将要复制的数据的真实大小。 string 是一个特别好的例子,因为 sizeof(string) 在幼稚的实现(一个简单的数据指针)中通常是 sizeof(void*),或者在短字符串优化实现中是两个或三个单词。然而,当你复制一个字符串时,它的复制构造函数会复制所指向的数据,这是无法解释的。 vector 和许多其他人也是如此。
  • 我个人更喜欢以下启发式方法:按值内置,任何通过 const 引用具有复制构造函数的东西。
  • @GMan: :D ...不幸的是,它没有考虑可以帮助编译器避免复制的“按值传递”优化...尽管很难知道什么时候会踢:/
【解决方案2】:

绝对不是。除非您的特定实现具有写时复制语义(由于线程问题,这些天很少见),否则必须在按值传递时复制整个字符串(即使实际的字符串数据存储在堆上)。即使字符串对象本身在内部只是几个指针,要复制的数据量也与字符串的长度成线性关系。

【讨论】:

    猜你喜欢
    • 2016-03-10
    • 2021-07-04
    • 2012-01-16
    • 2012-10-14
    • 2020-01-03
    • 1970-01-01
    • 2023-03-02
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多