Информация об изменениях

Сообщение Re[5]: cout data OR string_view от 08.09.2023 21:29

Изменено 08.09.2023 22:32 Sm0ke

Re[5]: cout data OR string_view
Если вывести в cout мембер data, то clang вызывает strlen
Но если выдать string_view, то в регистр пишется константа длинны

lnk: https://godbolt.org/z/M14oGv81f
#include <iostream>
#include <type_traits>
#include <string_view>

template <std::size_t N> struct static_text
{
  char data[N];
  constexpr static_text(const char (&s)[N]) {
    for (std::size_t i = 0; i != N; ++i) { data[i] = s[i]; }
  }
  constexpr std::string_view sv() const { return {data, N}; }
};

template <static_text S> constexpr auto operator "" _st () { return S; }

//

template <static_text S>
struct TAG {};

//

int main()
{
  static constexpr static_text cv = "123"_st;
  static_assert(std::is_same_v< TAG<"123">, TAG<cv> >);
  static_assert(!std::is_same_v< TAG<"456">, TAG<cv> >);
  //static_text tv = "1234"_st;
  std::cout << cv.sv() << '\n';
  std::cout << cv.data << '\n';
  return 0;
}


        mov     edx, 4
        call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)

        call    strlen
        mov     edi, offset std::cout
        mov     esi, offset main::cv
        mov     rdx, rax
        call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
Re[5]: cout data OR string_view
При выводе в cout мембера data, то clang вызывает strlen
Но если выдать string_view, то в регистр пишется константа длинны

lnk: https://godbolt.org/z/M14oGv81f
#include <iostream>
#include <type_traits>
#include <string_view>

template <std::size_t N> struct static_text
{
  char data[N];
  constexpr static_text(const char (&s)[N]) {
    for (std::size_t i = 0; i != N; ++i) { data[i] = s[i]; }
  }
  constexpr std::string_view sv() const { return {data, N}; }
};

template <static_text S> constexpr auto operator "" _st () { return S; }

//

template <static_text S>
struct TAG {};

//

int main()
{
  static constexpr static_text cv = "123"_st;
  static_assert(std::is_same_v< TAG<"123">, TAG<cv> >);
  static_assert(!std::is_same_v< TAG<"456">, TAG<cv> >);
  //static_text tv = "1234"_st;
  std::cout << cv.sv() << '\n';
  std::cout << cv.data << '\n';
  return 0;
}


        mov     edx, 4
        call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)

        call    strlen
        mov     edi, offset std::cout
        mov     esi, offset main::cv
        mov     rdx, rax
        call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)