按值或按引用传递C++字符串

Ano*_*ous 21 c++ string

我想知道C++字符串是否被认为足够小,以便在通过值而不是通过引用传递时更高效.

GMa*_*ckG 32

不可以参考:

void foo(const std::string& pString);
Run Code Online (Sandbox Code Playgroud)

通常,如果它们具有非平凡的复制构造函数,则通过引用传递,否则按值.

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

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

  • 你的启发式方法不适用于`double`和`long double`(通常更好地通过值传递).同样,对于单参数函数,通常最好按值传递2 x机器字UDT,因为寄存器将用于存储两个部分(并节省额外的间接). (5认同)
  • 此外,`sizeof(T)`通常是一个非常糟糕的度量,只是因为它不能测量将要复制的数据的真实大小.`string`就是一个特别好的例子,因为`sizeof(string)`在一个朴素的实现(一个简单的数据指针)上通常是`sizeof(void*)`,或者是短字符串优化的两三个字实现.但是,当您复制字符串时,其复制构造函数将复制指向的数据,该数据是未计入的."矢量"和其他许多相同. (4认同)
  • 我个人更喜欢以下启发式:按值构建内置,通过const引用具有复制构造函数的任何内容. (4认同)