[PATCH] D129533: [ADT] Pass string_view via copy

ppenguin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 11 23:52:09 PDT 2022


prehistoric-penguin added a comment.

In D129533#3644282 <https://reviews.llvm.org/D129533#3644282>, @saugustine wrote:

> Why should these be different than the other constructors which don't take copies?

Thanks, take the cheap object `std::string_view` by copy is the preferred way:

- They have performance differences, pass by reference has one more level of indirection, so we need one more instruction when compared with the copy way

For such code snippet <https://godbolt.org/z/19rWfd96W>:

  cpp
  #include <string>
  #include <benchmark/benchmark.h>
  void TakesStringViewByValue(std::string_view s)
  {
      benchmark::DoNotOptimize(s.data());
  }
  void TakesStringViewByRef(const std::string_view& s)
  {
      benchmark::DoNotOptimize(s.data());
  }

We get the disassembly after build with `-O3`:

  asm
  TakesStringViewByValue(std::basic_string_view<char, std::char_traits<char> >): # @TakesStringViewByValue(std::basic_string_view<char, std::char_traits<char> >)
    movq %rsi, -8(%rsp)
    retq
  TakesStringViewByRef(std::basic_string_view<char, std::char_traits<char> > const&): # @TakesStringViewByRef(std::basic_string_view<char, std::char_traits<char> > const&)
    movq 8(%rdi), %rax
    movq %rax, -8(%rsp)
    retq
  _GLOBAL__sub_I_example.cpp: # @_GLOBAL__sub_I_example.cpp
    jmp benchmark::internal::InitializeStreams()@PLT # TAILCALL

And according to the abseil c++ tips week 1 <https://abseil.io/tips/1>, they also recommend us to pass `std::string_view` by copy:

> Unlike other string types, you should pass string_view by value just like you would an int or a double because string_view is a small value.




Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D129533/new/

https://reviews.llvm.org/D129533



More information about the llvm-commits mailing list