Сообщение 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
Но если выдать 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
Но если выдать 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)