Home >Backend Development >C++ >Should You Pass `std::string` and `std::vector` by Value or Const Reference?

Should You Pass `std::string` and `std::vector` by Value or Const Reference?

Susan Sarandon
Susan SarandonOriginal
2024-12-29 00:22:10731browse

Should You Pass `std::string` and `std::vector` by Value or Const Reference?

Passing Parameters by Value: Rethinking const std::string &

Herb Sutter recently questioned the conventional practice of passing std::vector and std::string objects by const reference. He suggests that in many cases, passing them by value is now preferable, as demonstrated in the following code:

std::string do_something(std::string inval) {
  std::string return_val;
  // ... do stuff ...
  return return_val;
}

While the return value is an rvalue at the point of function return and can be moved cost-effectively, the rationale for Sutter's statement lies in cases like this:

Consider a function A that invokes function B, which in turn invokes function C. A passes a string parameter to B, which forwards it to C. A has no direct knowledge of C.

If B and C take the string by const reference, the code would appear as follows:

void B(const std::string &str) {
  C(str);
}

void C(const std::string &str) {
  // Process `str` without storing it.
}

With this approach, passing and receiving pointers suffices, avoiding costly copying or moving.

However, if C needs to store the string:

void C(const std::string &str) {
  // Process `str`.
  m_str = str;
}

This triggers a copy constructor and potential memory allocation (ignoring Short String Optimization). While C 11's move semantics aim to eliminate unnecessary copying, C taking a const reference prevents this, despite A passing a temporary string.

Conversely, if str were passed by value through all functions, relying on move semantics to transfer ownership, C could either adopt or discard the data without causing a copy operation. This approach comes with a slight performance overhead, but it eliminates memory allocations, which may be advantageous depending on the specific use case.

The above is the detailed content of Should You Pass `std::string` and `std::vector` by Value or Const Reference?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn